どこかの活動のライフサイクルでは、あなたはその同じを使用しようとした、mHelper.dispose()
と呼ばれるので、あなたはおそらく、例外を取得しています後でインスタンスを配置します。私の推奨は、onDestroy()
にmHelperを処分し、それをonCreate()
に再作成することです。
ただし、IabHelperとデバイスのローテーションに関する別の問題が発生します。この問題は次のようになります。アクティビティのonCreate()
では、IHBHelperインスタンスmHelperを作成して設定します。その後、mHelper.launchPurchaseFlow(...)
に電話をかけると、IABポップアップダイアログがアクティビティの上に浮かんで表示されます。その後、デバイスを回転すると、IubHelperインスタンスはonDestroy(...)
に処分され、onCreate(...)
に再作成されます。 IABダイアログは引き続き表示され、購入ボタンを押すと購入が完了します。アクティビティでonActivityResult()
が呼び出され、当然mHelper.handleActivityResult(...)
が呼び出されます。問題は、launchPurchaseFlow(...)
がIabHelperの再作成されたインスタンスで呼び出されたことがないことです。現在のインスタンスでlaunchPurchaseFlow(...)
が以前に呼び出された場合、IabHelperはhandleActivityResult(...)
のアクティビティー結果のみを処理します。 OnIabPurchaseFinishedListenerは決して呼び出されません。
私の解決策は、launchPurchaseFlow(...)
を呼び出さずにhandleActivityResult(...)
と期待するようにIabHelperを修正することでした。私は、これはhandleActivityResult(...)
が呼び出されたときIabHelperがリスナーにonIabPurchaseFinished(...)
を呼び出すようになります
public void expectPurchaseFinished(int requestCode, OnIabPurchaseFinishedListener listener)
{
mRequestCode = requestCode;
mPurchaseListener = listener;
}
IabHelper.java
に次を追加しました。 IabHelperの私の全体のコピーがここに
https://gist.github.com/benhirashima/7917645を見つけることができます
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
mHelper.expectPurchaseFinished(requestCode, mPurchaseFinishedListener);
mHelper.handleActivityResult(requestCode, resultCode, data);
}
:次に、あなたがこれを行います。私がIABHelperのコピーをthis commitにあるバージョンで更新しました。これはいくつかのバグを修正し、Android SDK Managerには公開されていません。また、newer commitsがありますが、それにはnew bugsが含まれているため、使用しないでください。
回転イベントを処理するためのきれいな解決策。 expectPurchaseFinishedが意味することを理解するのに苦労しましたが、結果を処理する直前にpurchaseFinishedListenerの新しいインスタンスを設定していることに気付きました。アクティビティとiabHelperがあったとしても、購買済みイベントを処理するリスナーが存在することが保証されます。再作成。 –
同じ考え方でmPurchasingItemTypeを処理することができます(たとえば、onSaveInstanceStateとonRestoreInstanceStateを使用し、正しい項目タイプが設定されていない場合は、subsとinappの両方を使用している場合のみ問題です)。 –