Не удается поймать IllegalStateException из среды IAB Google - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть приложение Google Play, в котором используется In App Billing v3 framework.

Консоль разработчика Google Play сообщает о частых сбоях с java.lang.IllegalStateException

На самом деле большая часть моих аварий - это исключение из незаконного состояния.Я использовал пример кода из инфраструктуры IAB для обработки своих покупок в приложении.

Стек вызовов:

  at com.steenriver.armor.util.IabHelper.flagStartAsync (IabHelper.java:824)
  at com.steenriver.armor.util.IabHelper.queryInventoryAsync (IabHelper.java:616)
  at com.steenriver.armor.util.IabHelper.queryInventoryAsync (IabHelper.java:644)
  at com.steenriver.armor.ArmorActivity$1.onIabSetupFinished (ArmorActivity.java:185)
  at com.steenriver.armor.util.IabHelper$1.onServiceConnected (IabHelper.java:262)
  at android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:1625)
  at android.app.LoadedApk$ServiceDispatcher$RunConnection.run (LoadedApk.java:1653)
  at android.os.Handler.handleCallback (Handler.java:836)
  at android.os.Handler.dispatchMessage (Handler.java:103)
  at android.os.Looper.loop (Looper.java:232)
  at android.app.ActivityThread.main (ActivityThread.java:6802)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1103)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:964)

Чтобы избавиться от сбоев, я решил добавить обработку исключений в коднапример, так:

try
{
    mHelper.launchPurchaseFlow( this, sku, RC_REQUEST, mPurchaseFinishedListener, payload );
} catch( IllegalStateException e )
{
    Log.e( TAG, e.toString() );     // Illegal State: maybe purchase is already in progress?
    enableBuyButton();              // Enable buy button so customer can try again.
}

К моему изумлению, новая версия с добавленным try / catch по-прежнему аварийно завершает работу с тем же стеком вызовов.

Это потому, что исключение IllegalStateException невозможновсе или что?Что здесь происходит?

1 Ответ

0 голосов
/ 12 февраля 2019

Если вы внимательно посмотрите на свой стек вызовов, вы увидите, что он не включает launchPurchaseFlow().Блоки try могут перехватывать только исключения из кода, который находится внутри них должным образом, и поскольку ваше исключение не происходит внутри какого-либо вызова launchPurchaseFlow(), оно не происходит внутри вашего try.

* 1007.* заставляет конечный автомат выставления счетов начинать продвижение, но не каждая операция покупки происходит внутри этой функции.Другими словами, покупка завершается «асинхронно».

Как видно из трассировки стека, исключение действительно происходит во время onServiceConnected(), который вызывается из обратного вызова Handler.launchPurchaseFlow() фактически уже вернулся к этому пункту;try блок в прошлом.Чтобы окружить эту конкретную операцию try, вам действительно нужно отредактировать метод IabHelper, такой как onServiceConnected().И это не рекомендуется, так как кажется, что какая-то другая ошибка в вашем собственном коде вызывает исключение.Это то, что должно быть исправлено.

Кстати, я не могу найти версию библиотеки биллинга v3, в которой flagStartAsync() выдает IllegalStateException, поэтому я не уверен, что это все.

Обязательное упоминание: IabHelper, видимо, больше не поддерживается Google;вместо этого вы должны использовать клиентскую библиотеку биллинга 1025 *.На используемую вами библиотеку больше не ссылается ссылка, которую вы разместили.

...