10

アプリ内課金 v3 をアプリに実装してから約 1 週間が経ちました。統合を簡素化するために、多くの Android のサンプル コードを使用しました。再現できないように見えるクラッシュをかなり頻繁に記録しています。

Exception Type: java.lang.RuntimeException
Reason: Unable to destroy activity    {[package].billing.BillingActivity}: java.lang.IllegalArgumentException: Service not registered: [package].billing.util.IabHelper$1@40646a70

この行で壊れているようです:

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

このサービスを onCreate メソッドでバインドし、onDestroy メソッド (このエラーが記録される場所) で破棄しています。ポインタはありますか?

4

4 に答える 4

34

あなたが言及した行を置き換えることができます:

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

この行で

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

これでうまくいくはずです

于 2013-05-11T21:04:51.030 に答える
6

同じ問題が発生しましたが、Androidエミュレーターで発生しました。Billing v3 では、Google Play アプリを少なくとも 1 回起動する必要があります。エミュレーターには 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() にこれを追加します。私にとってはうまくいきます。

于 2013-04-26T01:32:52.583 に答える
0

IabHelper授業は通常通り行っています。

必要なことはstartSetup、ヘルパーを呼び出すときにIabHelper.OnIabSetupFinishedListener、セットアップの開始結果を通知するコールバックを渡す必要があることです。コールバックに失敗した場合は、Google Play サービスとのサービス接続が確立されていません。IabHelperで受け取った結果に応じて、への今後の呼び出しを処理する必要がありますIabHelper.OnIabSetupFinishedListenerbooleanどんなステータスだったのかを知るフィールドをきっと確保できます。

サムが提供した答えは、実際にはトリックです (彼自身の言葉で)。ヘルパー クラスは、これらのクラスのユーザーがそのようなシナリオで何らかのタスクを実装できるように、例外をスローすることは想定されていません。

そしてもちろん、try/catch詳細に行きたくない場合は、これが最善の方法です (例外が原因で何かが壊れたときはいつでも、最初に頭に浮かぶのはそれをtry/catchブロックに入れることです)。

于 2017-04-18T07:05:41.470 に答える