2013-04-25 67 views
10

我已經在應用程序結算v3在我的應用程序實現了大約一個星期了。我使用了很多android的示例代碼來簡化集成。我已經登錄崩潰相當頻繁,我似乎無法重現:In App Billing v3 IllegalArgumentException使用IabHelper

Exception Type: java.lang.RuntimeException 
Reason: Unable to destroy activity {[package].billing.BillingActivity}: java.lang.IllegalArgumentException: Service not registered: [package][email protected] 

這似乎是在這條線斷:

if (mContext != null) mContext.unbindService(mServiceConn); 

我在我的這種綁定服務的onCreate方法並將其放置在我的onDestroy方法中(這是記錄此錯誤的地方)。任何指針?

回答

6

我剛剛遇到同樣的問題,但在Android模擬器上。 Billing v3要求Google Play應用程序至少啓動一次,並且由於模擬器缺少Google Play應用程序,因此無法設置幫助程序並且無法將其置於onDestroy()中。

我個人的解決辦法只是跳過錯誤的try/catch:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    if (bHelper != null){ 
     try { 
      bHelper.dispose(); 
     }catch (IllegalArgumentException ex){ 
      ex.printStackTrace(); 
     }finally{} 
    } 
    bHelper = null; 
} 

在每一個的onDestroy(),您處置助手添加此。對我來說工作得很好。

+0

Ohhhh,很好的解決方法。謝謝! – jbenowitz 2013-04-30 18:41:23

+10

這是一個醜陋的解決方案和編程風格(捕捉異常並對其無所作爲)。你應該找到問題的原因,而不是隱藏效果。原因是服務沒有連接,因此mService = null(正如Sam注意到的)並且mSetupDone = false。您可以檢查其中任何一個,以避免對未綁定的服務執行解除綁定。 – Laviniux 2013-05-20 12:19:43

+0

即使這可能看起來很醜,它也很好。我的崩潰是由重新開始的活動給出的 - a.finish(); startActivity(一); - 事實上,服務通常用來關閉服務的時間是主要問題。我認爲這可以通過延遲此調用輕鬆處理: bindService(serviceIntent,mServiceConn,Context.BIND_AUTO_CREATE);幾秒鐘。那是我的情況。 – Matteo 2015-12-08 22:58:48

34

你可以取代你提到的行:

if (mContext != null) mContext.unbindService(mServiceConn); 

通過這條線

if (mContext != null && mService != null) mContext.unbindService(mServiceConn); 

這應該做的伎倆

+0

這對我有用。謝謝! – Doigen 2013-09-17 17:13:39

+3

比接受的答案更好的解決方案。 – dldnh 2014-11-02 15:28:59

16

我檢查了最新版本的sample project和最多今天我的建議是目前到不是使用IabHelper。它有很大的缺陷。

爲了給你一個想法:

1)的IabHelper異步方法啓動一個新線程。如果在線程運行時調用IabHelper.dispose(),您將始終得到各種您甚至無法處理的異常。

2.)如果與計費服務的連接斷開,他們將其設置爲null。但除此之外,他們從來沒有檢查是否mServicenull訪問方法之前。所以在這種情況下它總是會與NullPointerException一起崩潰。

public void onServiceDisconnected(ComponentName name) { 
       logDebug("Billing service disconnected."); 
       mService = null; 

這只是冰山的一角。說真的,我不明白有人可以將它作爲參考代碼發佈。

+2

我同意。 IabHelper有很多與處理併發異步調用有關的錯誤。例如,它使用非同步標誌來指示已經運行的操作。我修改了IabHelper使用單線程執行程序並一次執行一個異步操作。這也適用於處置方法。仍然不完美,但線程安全。 – 2013-08-24 09:29:26

+4

@Joerg您能否發佈差異,以便我們可以看到您的更改?謝謝! – aleb 2014-07-09 11:41:31

0

IabHelper類正常工作。

你需要做的是: 當你給助手打電話startSetup時,你需要傳遞一個回調IabHelper.OnIabSetupFinishedListener,它會告訴你開始設置的結果。如果您在回撥中失敗,則與Google Play服務的服務連接未建立。 根據在IabHelper.OnIabSetupFinishedListener中收到的結果,您應該處理將來的電話號碼IabHelper。你當然可以保留一個boolean字段,以瞭解狀態。

提供的答案sam實際上是一個把戲(用他自己的話來說)。輔助類不應該拋出異常,以便這些類的用戶可以在這種情況下執行某些任務。

當然,try/catch是最好的方法,如果你不想詳細介紹(每當有什麼因爲例外而中斷,肯定首先想到的是把它放在try/catch區塊中)。