4

現在、HTTP/REST リクエストを使用してバックエンドと通信する Android アプリケーションを開発しています。これまで組み込みのHttpURLConnectionがうまく機能していたので、特定のライブラリはまだ使用していません。ただし、接続の問題が原因でリクエストが失敗した場合は、何らかのフォールバック メカニズムが必要です。同様の問題はhttps://stackoverflow.com/questions/31786486/android-volley-internet-queueにも記載されていますが、まだ回答がありません。他の関連する投稿では、古い応答をキャッシュしてリクエストをキャッシュにリダイレクトすることに重点を置いています。接続できません。

これまではVolleyを使用することを検討していましたが、私が理解している限りでは、最終的に接続するまで失敗したリクエストを再試行することしかできません。BroadcastReceiverを介して接続状態の変更を登録した後、失敗したリクエストをキャッシュし、再送信を試みるのがよりクリーンなソリューションになると思います。私のためにそれを行う既存のソリューションはありますか、それとも内部データベースをセットアップしてプロセス全体を自分で管理する必要がありますか?

TL;DR

デバイスがオフラインのときに失敗した HTTP/REST リクエストを Android デバイスに保存し、デバイスが再び接続を確立できるようになったときにそれらを再送信したいと考えています。私は何を探していますか?

4

2 に答える 2

2

レポートサービスでも同じ状況がありました。私が実装したのは、リクエストを受信して​​キューに入れるServiceでした。別のスレッド (サービスの開始時に開始) で、キューをチェックし、接続を試みます。BlockingQueueを使用すると、スレッド間の「シグナリング」が無料になるため、アイドル ポーリングを行う必要はありません。

WifiManager.WIFI_STATE_CHANGED_ACTIONおよび/またはConnectivityManager.CONNECTIVITY_ACTIONイベントのレシーバーをセットアップして、サービスを開始するか、スレッドを起動して、接続が再開されたときに再送信を試みることができます。

アクティビティのコードからこれらすべてを切り離し、それを開始および停止するための機能をいくつか用意できるように、Service をお勧めします。私は個人的に IntentService を使用しました。これにより、Intentsを介してリクエストをシリアル化し、OS に Intent 管理の送信を処理させることができます。Service がなくても、Singleton オブジェクトだけを使用して、別の方法で実装することができます。

アプリが実行されていないときにそれらを保存する必要がある場合は、SQLite データベースを使用します。

于 2015-08-06T09:05:58.123 に答える
1

@Sebastian が書いたように、自分でキュー ハンドラを作成するか、android-priority-jobqueueなどの既存の実装が役に立たないかどうかを確認できます。

于 2015-08-06T09:17:36.163 に答える