2016-08-23 9 views
0

В моем приложении есть два вида деятельности: CreateOrderActivity и PaymentResultActivity. Для завершения платежа используется стороннее платежное приложение.ProgressDialog.show застрял во время обработки события Отто

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 run с успехом. Но когда я снова добавлю новый заказ в приложение и закончу платеж, мероприятие также будет опубликовано, но приложение просто застрянет и не проверит результат.

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

Кстати, режим запуска PaymentResultActivity - singleTop, который требуется сторонним приложением.

ответ

0

Похоже, что когда Отто запускает событие до 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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^