Android 处理远程服务器断开连接的正确方法是什么?

Android 处理远程服务器断开连接的正确方法是什么?,android,android-service,android-service-binding,Android,Android Service,Android Service Binding,几乎所有使用远程服务的示例都包含这样的代码(此代码取自GoogleHelper) 为什么mService字段总是设置为null?忽略onServiceConnected回调是错误的吗?根据我的经验,重连通常发生在1-2秒之后。。 Google IbaHelper甚至不检查mService是否为null,尽管该字段被广泛使用,甚至有几个异步方法。我的许多用户在断开连接的情况下得到NPE。 我想给你打电话。问题是如何 在异步方法中使用字段mService时,处理断开连接的正确方法是什么?只需忽略on

几乎所有使用远程服务的示例都包含这样的代码(此代码取自GoogleHelper)

为什么mService字段总是设置为null?忽略onServiceConnected回调是错误的吗?根据我的经验,重连通常发生在1-2秒之后。。 Google IbaHelper甚至不检查mService是否为null,尽管该字段被广泛使用,甚至有几个异步方法。我的许多用户在断开连接的情况下得到NPE。 我想给你打电话。问题是如何

在异步方法中使用字段mService时,处理断开连接的正确方法是什么?只需忽略onServiceDisconnected并获取RemoteExceptions?我考虑过等待通知的方法,但不能保证会发生重新连接。
欢迎任何想法。

IABHeloper示例在几个月前已更新,以修复许多错误,因此首先,请确保您拥有最新版本。我使用了一个较早的版本,并且自己做了各种修复,所以我不能说最新的版本是否真的修复了这个问题

这是一个不久前提出的问题:

通常的方法是复制和编辑IbaHelper,并在您自己的副本中,在launchPurchaseFlow()的顶部测试空值。大概是这样的:

//If the service has somehow disconnected, then we cannot make the purchase
if(mService == null) {
  result = new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, 
    "Unable to buy item because billing service disconnected unexpectedly.");
if (listener != null) listener.onIabPurchaseFinished(result, null);
  flagEndAsync();
  return;
}
...
boolean asyncWasInProgress = mAsyncInProgress;
if(asyncWasInProgress) {
  flagEndAsync();
}
此外,在onServiceDisconnected()结束时,您将希望中止任何可能因服务断开而中断的异步操作。大概是这样的:

//If the service has somehow disconnected, then we cannot make the purchase
if(mService == null) {
  result = new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE, 
    "Unable to buy item because billing service disconnected unexpectedly.");
if (listener != null) listener.onIabPurchaseFinished(result, null);
  flagEndAsync();
  return;
}
...
boolean asyncWasInProgress = mAsyncInProgress;
if(asyncWasInProgress) {
  flagEndAsync();
}

希望这是有帮助的。IabHelper(至少是我使用的早期版本)有很多错误,因此您可能会遇到这种情况,这样的问题需要在您遇到时加以解决。

我重构了下载的谷歌V3包装类IabHelper,以消除空指针异常。在我的项目中,我没有看到锁定/同步问题的任何方面。除了与计费服务的连接中断外,没有并行处理,并且将对象设置为null不会花费很长时间

结果可从下载


我还可以自由地缩短某些方法的长度并将其拆分。我是方法主体不应超过屏幕或页面的方法的粉丝;有助于提高代码的可读性。

谢谢您的回答。提到的问题是我自己的:),但在多线程环境中检查null不是一种正确的方法。无论如何,谢谢。ServiceConnection的文档声明“与系统中的许多回调一样,此类上的方法是从进程的主线程调用的。”因此,多线程执行问题不应适用于这种情况。ServiceConnection对象保持活动状态,如果服务恢复,将调用其OnServiceConnection()方法,MSService将设置为非null,您可以再次处理购买@这取决于你怎么做。一种技术是只从主线程检查null;其他新线程不应检查该变量是否为null(如果需要检查null,则在主线程上发布runnable)。其他方法可能包括使用可变变量。但正如Carl所暗示的,知道在哪个线程上执行哪个代码段会有所帮助。锁定(通过
synchronized
)似乎是最简单的方法,但主线程不能等待获得锁。