2016-08-23 125 views
0

我的應用有兩個活動,CreateOrderActivityPaymentResultActivity。第三方付款應用程序用於完成付款。ProgressDialog.show在處理Otto事件時卡住

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運行成功。但是,當我在應用再次發出新訂單並完成付款時,活動也會發布,但應用只會卡住,不會檢查結果。

我添加的三條線的調試日誌記錄到上面的代碼以找出在該步驟中,應用程序被卡住,並且它顯示出該12在Android監視器進行打印,但是3將永遠不會被印刷,其意味着ProgressDialog.show無法成功執行,程序剛剛卡在那裏。我不明白爲什麼代碼只能在第二次嘗試中失敗。

順便說一下,PaymentResultActivity的啓動模式是singleTop,這是第三方應用程序所要求的。

回答

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(); 
    } 
}