23

請求をテストしていますが、次の例外が発生しました。

java.lang.IllegalStateException: Can't start async operation (launchPurchaseFlow) because another async operation(launchPurchaseFlow) is in progress.
        at utils.IabHelper.flagStartAsync(IabHelper.java:711)
        at utils.IabHelper.launchPurchaseFlow(IabHelper.java:316)
        at utils.IabHelper.launchPurchaseFlow(IabHelper.java:294)
        at com.problemio.SubscribeIntroActivity$6.onClick(SubscribeIntroActivity.java:117)
        at android.view.View.performClick(View.java:2532)
        at android.view.View$PerformClick.run(View.java:9308)
        at android.os.Handler.handleCallback(Handler.java:587)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:150)
        at android.app.ActivityThread.main(ActivityThread.java:4293)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
        at dalvik.system.NativeStart.main(Native Method)

このコードを実行した後:

    Button subscribe = (Button)findViewById(R.id.subscribe);
    subscribe.setOnClickListener(new Button.OnClickListener() 
    {  
       public void onClick(View v) 
       {              
           // FIRST CHECK IF THE USER IS ALREADY A SUBSCRIBER.
          mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);

       }
    });   

しかし、これに先立って、テストユーザーとしてテスト製品IDを実行しました.android.test.purchasedで動作しました。しかし、製品 ID を自分の製品 ID の 1 つに変更すると、上記の例外でクラッシュしました。

なぜそれが起こったのですか?ありがとう!

4

4 に答える 4

55

IabHelper では、一度に実行できる非同期クエリは 1 つだけです。onActivityResult()パラメータを実装しhandleActivityResult()て IabHelper のメソッドに渡す必要があります。

アプリ内課金のサンプル コードは、次のようにメソッドを実装します。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}
于 2013-01-02T22:18:33.307 に答える
2

私のように、誰かが木を求めて森を恋しがっている場合に備えて...

Play デベロッパー コンソールでスタック トレースを受け取りましたjava.lang.IllegalStateExceptionが、エラー メッセージ以上のものは提供されませんでした。困惑しました。

IAB をトリガーするボタンを 2 回タップしようとは思わなかったので、最初はこれがどのように起こっているのか理解できませんでした。([時々]タップしてみましょうオーバーレイのため、最初のタップ後に無効に見えます)。

そのため、ユーザーがボタンを 2 回タップできないようにしてください。

于 2015-11-24T23:08:51.603 に答える
1

あなたはGoogleのサンプルコードを使用しており、IabHelperクラスの793行目にこのコードがあります

 if (mAsyncInProgress) throw new IllegalStateException("Can't start async operation (" +
            operation + ") because another async operation(" + mAsyncOperation + ") is in       progress.");

初めて購入すると「mAsyncInProgress」が true になり、購入を消費するまで true のままなので、購入を消費する必要があります。util パッケージのすべてのクラスを完全に読むことをお勧めします。

購入が成功したら、それを消費する必要があります

mHelper.consumeAsync(purchase, mConsumeFinishedListener)

ただし、消費リクエストが失敗する場合があるため、アクティビティが作成されるたびに購入を処理する必要があります。

mHelper.queryInventoryAsync(mGotInventoryListener);

mGotInventoryListener コールバックで購入を消費しようとします。

于 2013-11-14T19:06:10.703 に答える