ProgressDialog.show在处理Otto事件时遇到困难

时间:2016-08-23 20:42:58

标签: android progressdialog otto

我的应用中有两项活动,CreateOrderActivityPaymentResultActivity。第三方付款应用程序用于完成付款。

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

我想将结果发送回CreateOrderActivity,所以我使用Otto:

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成功运行。但是,当我在应用再次中下新订单并完成付款时,该活动也会发布,但该应用只会停滞不前并且不会检查结果。

我在上面的代码中添加了三行调试日志记录,以了解应用程序停留在哪一步,并显示在Android监视器中打印了12,但永远不会打印3,这意味着ProgressDialog.show无法成功执行,程序就会卡在那里。我无法理解为什么代码会在第二次尝试时失败。

顺便说一句,PaymentResultActivity的启动模式为singleTop,这是第三方应用程序所必需的。

1 个答案:

答案 0 :(得分:0)

当Otto将事件重新发送回CreateOrderActivity时,活动仍然在后台暂停,并且无法在UI(窗口,视图等)上提交任何操作。因此,我在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();
    }
}