ProgressDialog.show застрял при обработке события Otto

В моем приложении есть два действия: CreateOrderActivity и PaymentResultActivity. Для завершения платежа используется стороннее платежное приложение.

CreateOrderActivity -> 3rd-party payment app -> PaymentResultActivity

И я хочу отправить результат обратно в CreateOrderActivity, поэтому я использую Отто:

CreateOrderActivity -> 3rd-party payment app -> PaymentResultActivity
         ^                                                |
         |-------------------- Otto <----------------------

Вот код:

// PaymentResultActivity

bus.post(new PaymentFinishedEvent(resultCode));
finish();
// CreateOrderActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    bus.register(this);
}

@Subscribe
public void onPaymentFinished(PaymentFinishedEvent event) {
    checkPaymentResult(event.resultCode);
}

private void checkPaymentResult(int resultCode) {
    Log.i("checkPaymentResult", "1");
    Request request = buildCheckingPaymenResultRequest();

    Log.i("checkPaymentResult", "2");
    final ProgressDialog progressDialog = ProgressDialog.show(this, "", "Checking...", true);

    Log.i("checkPaymentResult", "3");
    request.execute(new Listener() { ... });
}

Когда я запускаю приложение и оплата завершена, запускается PaymentResultActivity, событие отправляется в шину, и метод checkPaymentResult выполняется успешно. Но когда я снова размещу новый заказ в приложении и закончу оплату, событие также будет опубликовано, но приложение просто зависнет и не проверит результат.

Я добавил три строки журнала отладки в приведенный выше код, чтобы узнать, на каком этапе приложение зависло, и это показывает, что 1 и 2 печатаются в мониторе Android, но 3 никогда не будет напечатано, что означает, что ProgressDialog.show может не выполняется успешно, и программа просто застревает там. Я не могу понять, почему код может дать сбой только со второй попытки.

Кстати, режим запуска PaymentResultActivitysingleTop, который требуется для стороннего приложения.


person Beta Kuang    schedule 23.08.2016    source источник


Ответы (1)


Кажется, что когда Отто запускает событие обратно в CreateOrderActivity, активность все еще приостанавливается в фоновом режиме и не может выполнять какие-либо операции в пользовательском интерфейсе (окно, представление и т. д.). Таким образом, я добавляю флаг в CreateOrderActivity, чтобы указать, нужно ли проверять результат платежа:

public class CreateOrderActivity extends AppCompatActivity {

    ...

    private boolean shouldCheckPaymentResult = false;

    ...
}

А в обработчике события просто установите флаг true:

@Subscribe
public void onPaymentFinished(PaymentFinishedEvent event) {
    if (event.resultCode == PaymentFinishedEvent.RESULT_SUCCESS) {
        shouldCheckPaymentResult = true;
    }
}

Последним шагом является проверка onResume():

@Override
protected void onResume() {
    super.onResume();

    if (shouldCheckPaymentResult) {
        shouldCheckPaymentResult = false;
        checkPaymentResult();
    }
}
person Beta Kuang    schedule 25.08.2016