17

Activities向きの変更、使用の停止/Fragments再開にどのように対処できVolleyますか?

GETリクエストの場合、レスポンスがキャッシュされ、そのリクエストを 2 回目に試みると、キャッシュされたレスポンスが返されることはわかっています (サーバーが適切な HTTP ヘッダーを送信した場合)。

しかし、どうPOSTですか?リクエストを行うとしPOSTます (つまり、一度だけ発生させたい登録)、アプリはバックグラウンドになり、アプリがまだバックグラウンドにある間にリクエストが終了し、アプリに戻ります。Responseそのを取得するにはどうすればよいですRequestか、または保留中の場合に再接続するにはどうすればよいですか?

私の知る限り、これはほとんどサポートされていませんVolley。私は正しいですか?を使用して、上記のシナリオを解決する簡単な方法はありVolleyますか?

4

4 に答える 4

8

Volley は、すぐに使用できるメカニズムを提供していませんが、Square の Android 用 Otto ライブラリを調べることができます。これは、あなたのような状況をエレガントに処理するように作られています。

ボレー リクエストのリスナーを実装して、「RegisterEventSuccess」などのイベント オブジェクトにラップされた成功応答をバスにポストするようにします (これは自分で定義します)。Otto の @Subscribe メカニズムを使用して、アクティビティまたはフラグメントがこのイベント タイプにサブスクライブできるようにします。たとえば、1 つのアクティビティがボレー リクエストを起動し、画面の向きが変わったために終了した場合、別のアクティビティ インスタンス (これも Otto バスに登録されています) は、ボレー リクエストの応答を含むイベントを受け取ることができます。

これが役に立ったことを願っています。

于 2013-08-05T11:53:17.007 に答える
4

私は今、@ 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を参照してください。

于 2014-05-15T18:44:49.050 に答える
1

Volley ライブラリを使用してネットワークからデータをダウンロードする際の問題を解決する簡単な解決策があります。Google の推奨事項によりアプリでフラグメントを使用する場合、データの読み込み中にユーザーが画面を回転させた場合にクラッシュを防ぐために行う必要があるすべてのことを、フラグメントのメソッド (-s) に入れsetRetainInstance(true);ますonCreateView

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View theView = inflater.inflate(R.layout.fragment_studios, container, false);
    setRetainInstance(true);
    lvStudios = (ListView) theView.findViewById(R.id.lvStudios);
  return theView;
}
于 2015-09-13T12:43:33.920 に答える