2014-01-23 54 views
3

几乎远程服务工作的各个实例包含这样的代码(这个是从谷歌IabHelper拍摄)处理远程服务器断开连接的正确方法是什么?

mServiceConn = new ServiceConnection() { 
     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      logDebug("Billing service disconnected."); 
      mService = null; 
     } 

     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      logDebug("Billing service connected."); 
      mService = getServiceFromBinder(service); 
      ... 
     } 
    }; 

为什么领域MSERVICE总是被设置为null?忽略onServiceConnected回调是错误的吗?根据我的经验,重新连接通常会在1-2秒后发生。 尽管该字段被广泛使用,但Google IABHelper甚至不会检查mService是否为null,即使是多个异步方法。很多我的用户在断开连接时都会得到NPE。 我想修补IabHelper。现在的问题是如何..

什么是当现场MSERVICE是异步方法中用于处理disconneсtion有道?只需忽略onServiceDisconnected并获得RemoteExceptions?我想过等待通知的方法,但不保证重新连接会发生。 欢迎任何想法。

回答

2

的IabHelper例子进行了更新,几个月前修复了一些bug,所以首先,要确保你有最新的版本。我已经使用了一个早期的版本,并对自己的版本进行了各种修复,所以我不能说最新版本是否确实修复了这个版本。

这里是已提交了前阵子关于它的问题:

https://code.google.com/p/android/issues/detail?id=41610

一般的做法是对的空值复制和编辑IabHelper,并在自己的副本,测试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; 
} 
... 

此外,在onServiceDisconnected结束(),你会想放弃可能已经被服务的中断断开任何异步操作。像这样的:

boolean asyncWasInProgress = mAsyncInProgress; 
if(asyncWasInProgress) { 
    flagEndAsync(); 
} 

希望是有帮助的。 IabHelper(至少是我用过的早期版本)有很多bug,所以你可以期望遇到这种事情,这样的问题需要在你做时修复。

+0

谢谢你的回答。提到的问题是我自己的:) – akarimova

+0

但在多线程环境中检查null不是正确的方法。无论如何,谢谢。 – akarimova

+0

ServiceConnection的文档声明:“像来自系统的许多回调一样,此类上的方法是从您的进程的主线程调用的。”所以,在这种情况下,多线程执行的问题不适用。 ServiceConnection对象保持活动状态,如果服务恢复时,它的onServiceConnected()方法将被调用,并且mService将被设置为非null,并且您将准备好再次处理购买。 http://developer.android.com/reference/android/content/ServiceConnection。html – Carl

0

我重构谷歌的下载V3包装类IabHelper摆脱空指针异常。我没有在我的项目中看到锁定/同步问题的一个方面。没有并行处理,除非与计费服务的连接中断,并且将对象设置为空将不需要很长时间。

结果可以从github下载。

我也觉得可以自由地减少一些方法的长度并将它们分开。我非常喜欢这种方法,即方法体不应该超过屏幕或页面;有助于使代码更具可读性。

相关问题