Hier ist, was ich getan habe:
Der Code der IabHelper
zu instanziiert und rufen startSetup()
innerhalb onCreate()
ist, so wird es neu erstellt werden, wenn das Gerät gedreht wird, so lange, wie Sie auf eigene Faust nicht Umgang mit Konfigurationsänderungen .
Vergewissern Sie sich auch, dass Sie .handleActivityResult()
am Anfang von onActivityResult()
anrufen. Dadurch wird sichergestellt, dass Ihre Referenz IabHelper
korrekt bereinigt wird, nachdem der Kaufdialog geschlossen wurde.
Mit diesen beiden Dingen sollten Sie keine weiteren Abstürze mehr sehen. Aber Sie werden bemerken, eine weitere Sache:
Wenn Sie den Kauf Dialog mit einem Aufruf an launchPurchaseFlow()
beginnen und drehen Sie dann das Gerät, wird der Dialog geöffnet bleiben, aber jetzt Ihre Activity
‚s IabHelper
Referenz seit onCreate()
überschrieben wurde aufgerufen auf Gerätedrehung. Aus diesem Grund wird beim Schließen des Dialogfelds die neue IabHelper
Methode handleActivityResult()
aufgerufen, die jedoch nicht mit der zuvor an launchPurchaseFlow()
übergebenen übereinstimmt, sodass Ihre onPurchaseFinishedListener
nicht benachrichtigt wird. Um diesen Fall zu bewältigen (Gerätedrehungen, wenn das Dialogfeld geöffnet ist), müssen Sie die selbst innerhalb von onActivityResult()
behandeln. Da der Dialog geschlossen wurde, sollten Sie nachahmen, was Sie in Ihrem onPurchaseFinishedListener
getan haben (ermitteln Sie, ob der Benutzer tatsächlich etwas gekauft hat). Ich habe gerade einen Anruf an queryInventoryAsync()
gemacht, um das herauszufinden.
Ich bin mir nicht sicher, ob das die ideale Lösung ist, aber es funktioniert gut für mich. Ich habe versucht, an der IabHelper
Referenz wie Sie, hängen, aber ich sah seltsame Probleme, wo es seinen Setup-Zustand verlieren würde, aber ich würde nicht erlauben, es neu einzurichten.
Eine letzte Sache, die ich getan habe, war die Aktualisierung von Abrechnungs-util-Klassen mit dem neuesten von der Android-Quelle. Es gibt einige Fehlerbehebungen, die nicht an den SDK-Manager weitergegeben wurden.Die meisten von ihnen sind fragwürdig null Kontrollen, aber es gibt einige Verbesserungen Abstürze zu verhindern:
latest changeset
Ordentliche Lösung bezüglich der Handhabung des Rotationsereignisses. Ich hatte einige Probleme damit zu verstehen, was 'expectPurchaseFinished' impliziert, aber ich habe schließlich festgestellt, dass du eine neue Instanz von purchaseFinishedListener vor der Verarbeitung des Ergebnisses einstellst, was garantiert, dass es einen Listener gibt, der das purchaseFinished-Ereignis behandelt, selbst wenn die Aktivität und iabHelper waren neu erstellt. –
Wir können die gleiche Idee erweitern, um den mPurchasingItemType zu behandeln (spielt nur eine Rolle, wenn Sie sowohl Subs als auch InApp verwenden, z. B. onSaveInstanceState und onRestoreInstanceState verwenden und dann den richtigen Elementtyp einstellen, wenn er nicht gesetzt ist). –