В моем приложении есть два действия: 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
может не выполняется успешно, и программа просто застревает там. Я не могу понять, почему код может дать сбой только со второй попытки.
Кстати, режим запуска PaymentResultActivity
— singleTop
, который требуется для стороннего приложения.