サーバーに POST 要求を行う小さな Android アプリがあります。問題は、要求が失敗したときに、デバイス上のネットワークの可用性を確認した後、しばらくしてから投稿を再試行できるようにすることです。これはどのように行うことができますか?送信するデータを永続化するためにサービスとデータベースを実装する必要がありますか? アラームマネージャーについて読んだことがありますが、アクティビティでこれを実装する方法がわかりません。
2 に答える
常にサービスを実行する必要はありません。POST または Web 要求が失敗した場合は、キューに入れることができます。(何らかの方法でリクエストを保存します [Shared params, db])。次に、ブロードキャスト レシーバーを使用し、接続をサブスクライブして意図を変更します。受信機で、現在接続されているかどうかを確認します。あなたとキューに何かがある場合は、サービスを生成してキューを処理できます。
あなたが興味を持つべき2つの正確な放送はこれらです
android.net.wifi.WIFI_STATE_CHANGED
android.net.wifi.supplicant.CONNECTION_CHANGE
このようにマニフェストでそれらに登録できます
<receiver android:name=".BroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<!-- .... -->
</intent-filter>
</receiver>
その放送受信機では、このコードを使用して、ネットワーク接続があるかどうかを確認できます。
public boolean isOnline() {
cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(cm == null)
return false;
final NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED) {
return true;
} else {
return false;
}
}
このコードには、これらの権限も必要です
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
BroadcastReceiver を拡張するクラスを作成し、そのクラスを次のように登録します。
ネットワーク上の変更により、このブロードキャストがトリガーされます。
受信した変更の詳細については、インテント エクストラ ConnectivityManager.EXTRA_NETWORK_INFO、ConnectivityManager.EXTRA_OTHER_NETWORK_INFO、ConnectivityManager.EXTRA_NO_CONNECTIVITY、および ConnectivityManager.EXTRA_REASON を確認できます。