アクティビティのライフサイクルのどこかで を呼び出しmHelper.dispose()
、後で同じ破棄されたインスタンスを使用しようとしたため、おそらく例外が発生しています。私の推奨は、mHelper のみを破棄しonDestroy()
て で再作成することですonCreate()
。
ただし、IabHelper とデバイスの回転で別の問題が発生します。問題は次のようになります。アクティビティのonCreate()
で、IabHelper インスタンス mHelper を作成してセットアップします。後で呼び出すmHelper.launchPurchaseFlow(...)
と、IAB ポップアップ ダイアログがアクティビティの上に浮かんで表示されます。次に、デバイスを回転すると、IabHelper インスタンスが で破棄され、 でonDestroy(...)
再作成されonCreate(...)
ます。IAB ダイアログがまだ表示されている場合、購入ボタンを押すと、購入が完了します。onActivityResult()
その後、アクティビティで が呼び出され、自然に を呼び出しますmHelper.handleActivityResult(...)
。問題は、launchPurchaseFlow(...)
IabHelper の再作成されたインスタンスで呼び出されたことがないことです。IabHelper は、アクティビティの結果のみを処理しhandleActivityResult(...)
ますlaunchPurchaseFlow(...)
は、現在のインスタンスで以前に呼び出されています。OnIabPurchaseFinishedListener が呼び出されることはありません。
これに対する私の解決策は、 IabHelper を変更して、handleActivityResult(...)
を呼び出さずに期待するように指示できるようにすることでしたlaunchPurchaseFlow(...)
。IabHelper.java に以下を追加しました
public void expectPurchaseFinished(int requestCode, OnIabPurchaseFinishedListener listener)
{
mRequestCode = requestCode;
mPurchaseListener = listener;
}
これにより、 が呼び出されたときに IabHelper がonIabPurchaseFinished(...)
リスナーを呼び出すようになりhandleActivityResult(...)
ます。次に、これを行います。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
mHelper.expectPurchaseFinished(requestCode, mPurchaseFinishedListener);
mHelper.handleActivityResult(requestCode, resultCode, data);
}
私の IabHelper の完全なコピーは、https: //gist.github.com/benhirashima/7917645 にあります。IabHelper のコピーをこの commitにあるバージョンで更新したことに注意してください。これにより、いくつかのバグが修正され、Android SDK Manager で公開されていません。また、新しい commitsもありますが、新しいバグが含まれているため、使用しないでください。