2014-01-23 56 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下載。

我也覺得可以自由地減少一些方法的長度並將它們分開。我非常喜歡這種方法,即方法體不應該超過屏幕或頁面;有助於使代碼更具可讀性。

相關問題