我的应用中有两项活动,CreateOrderActivity
和PaymentResultActivity
。第三方付款应用程序用于完成付款。
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监视器中打印了1
和2
,但永远不会打印3
,这意味着ProgressDialog.show
无法成功执行,程序就会卡在那里。我无法理解为什么代码会在第二次尝试时失败。
顺便说一句,PaymentResultActivity
的启动模式为singleTop
,这是第三方应用程序所必需的。
答案 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();
}
}