Синхронная настройка биллинговой службы в приложении

#android #android-billing

#Android #android-выставление счетов

Вопрос:

Я использую код, предоставленный Google (IabHelper.java и т.д.) для настройки биллинга в приложении в моем приложении для Android. Предоставленный код является асинхронным в том смысле, что мне нужно указать функцию обратного вызова, которая будет работать после успешного связывания службы.

Тем не менее, мне потребовалась информация о текущих подписках в разных видах деятельности. Поэтому я решил синхронно привязать биллинговую службу к методу onCreate действия и сохранить ее в статической переменной. Это должно быть относительно быстро, поскольку службы Google Play выполняют некоторое кэширование. Код, который я использую, следующий:

         // this - current activity
        CountDownLatch latch = new CountDownLatch(1);
        mService = new BillingService(this, latch);
        try {
            latch.await();
        } catch (InterruptedException ignored) {}
  

А затем onIabSetupFinished я звоню latch.countDown() . К сожалению, countDown это никогда не выполняется, и мой код застрял await() . Кто-нибудь знает, как решить эту проблему или предложить альтернативное решение?

Ответ №1:

onIabSetupFinished() вызывается из ServiceConnection.onServiceConnected() которого запланировано выполнение в основном потоке вашего приложения. Он не может запуститься, поскольку вы блокируете свой основной поток latch.await() .

Вы не смогли заблокировать приложение и вместо этого просто отображаете uncancellable, ProgressDialog пока не получите информацию от службы IAB.

Комментарии:

1. Чтобы продолжить, я должен закрыть диалоговое окно onIabSetupFinished() ? Значит, другого пути нет?

2. Точно, закройте диалоговое onIabSetupFinished() окно. Основной поток используется не только для пользовательского интерфейса, но и для обратных вызовов подключения к сервису и других вещей. Поэтому блокировать ее не стоит.