2016-08-23 11 views
0

私のアプリには2つのアクティビティ、CreateOrderActivityPaymentResultActivityがあります。サードパーティの支払いアプリを使用して支払いが完了します。Ottoイベントを処理中に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が実行されます。成功しました。しかし、私はに新しい注文を入れて支払いを終えると、そのイベントもポストされますが、アプリはちょうど立ち往生し、結果をチェックしません。

私はアプリがスタックしているステップれる見つけるために上記のコードにデバッグログの3行を追加し、それが12は、Androidモニタで印刷されますが、3が印刷されることはありません、そのことを示していますProgressDialog.showが正常に実行できなかったことを意味し、プログラムがそこに停滞していることを意味します。なぜコードが2回目の試行で失敗するのか理解できません。

ところで、PaymentResultActivityの起動モードは、サードパーティアプリケーションで必要とされるsingleTopです。

答えて

0

OttoがイベントをCreateOrderActivityに戻すと、アクティビティはバックグラウンドでも一時停止していて、UI(ウィンドウ、ビューなど)で操作をコミットできません。

public class CreateOrderActivity extends AppCompatActivity { 

    ... 

    private boolean shouldCheckPaymentResult = false; 

    ... 
} 

そして、ちょうどtrueにフラグを設定するイベントハンドラで:

@Subscribe 
public void onPaymentFinished(PaymentFinishedEvent event) { 
    if (event.resultCode == PaymentFinishedEvent.RESULT_SUCCESS) { 
     shouldCheckPaymentResult = true; 
    } 
} 

このように私はそれが支払いの結果をチェックする必要があるかどうかを伝えるためにCreateOrderActivityにフラグを追加します最後のステップは、チェックを行うことです。onResume()

@Override 
protected void onResume() { 
    super.onResume(); 

    if (shouldCheckPaymentResult) { 
     shouldCheckPaymentResult = false; 
     checkPaymentResult(); 
    } 
} 
関連する問題