私は今、@ kyle-ivey の懸念に対処しようとしました。応答が間に到着しonPause()
てonResume()
破棄されるということです。実際のアプリケーションで経験したので、これは実際の問題です。
私のアプローチは、Thomas Moerman による回答で実装されたイベント バス パターンに基づいていますが、サンプル アプリケーションをゼロから再実装しました。これは、Otto Event バス ライブラリ、Gson、およびVolleyに依存します。依存関係を解決するためにMavenを使用してIntelliJ 13 Ultimateに実装されています。
解決策:以前の回答に、アクティビティの遷移中にイベントをリッスンする責任を引き継ぐ HTTP 応答バッファとして機能するクラスを追加します。完了すると、アクティビティは、アクティビティがイベント バスに切断されている間に到着した可能性のある応答をアクティブにポーリングします。onPause
次のような方法で登録するイベントバスの横にあるand onResume
-eventsでオン/オフをフックします。
@Override
protected void onPause() {
super.onPause();
ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over
ServiceLocator.EventBus.unregister(this); // Unregistering with Otto
}
@Override
protected void onResume() {
ServiceLocator.EventBus.register(this); // Re-registering
ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered
}
これが ResponseBuffer-classの実装です。
警告 1 : アクティビティが再開されず、今後のアクティビティでstopAndProcess()
もstopAndPurge()
呼び出されない場合、バッファがメモリ リークの原因である可能性があります。使用方法に注意してください。安全なパターンは、stopAndProcess()
すべて のアクティビティに含めることです。onResume()
警告 2 : スレッドセーフではありません。保存を開始してからイベント バスを登録解除するまでの行でコンテキスト スイッチが発生した場合、イベントを 2 回または 0 回受信する可能性があります。
この例には、UI およびサポート クラスの形式でいくつかのテスト コードが含まれていますが、別のプロジェクトでこのパターンを利用する場合に必要となる主なクラスは、次のパッケージに含まれるものです。
- nilzor.ottovolley.core
- nilzor.ottovolley.メッセージ
テスト用の UI を含む完全な例については、github-repository OttoVolleyDoneRightを参照してください。