设备重新联机时重试发布请求

时间:2013-04-02 14:11:54

标签: android rest service httprequest alarmmanager

我有一个小的Android应用程序,向服务器发出一些POST请求,问题是我希望我的应用程序能够在请求失败时,在检查网络的可用性后重试Post一段时间设备。怎么做到这一点?是否有必要实现一个服务和一个数据库来保存我发送的数据?我已经阅读了一些关于alarmmanager的内容,但我不知道如何通过我的活动实现这一点。

2 个答案:

答案 0 :(得分:5)

您不一定需要一直运行的服务。当POST或任何Web请求失败时,您可以对其进行排队。 (以某种方式存储请求[Shared params,db])。然后使用广播接收器和订阅连接更改意图。在接收器中,检查您是否已连接。如果你队列中有东西,那么你可以产生一个服务来处理队列。

你应该感兴趣的两个确切的广播是这些

 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" />

答案 1 :(得分:0)

创建一个扩展BroadcastReceiver的类,然后像这样注册该类: registerReceiver(new BroadcastReceiverExtension,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

网络上的任何更改都会触发此广播。

您可以查看意图附加信息ConnectivityManager.EXTRA_NETWORK_INFO,ConnectivityManager.EXTRA_OTHER_NETWORK_INFO,ConnectivityManager.EXTRA_NO_CONNECTIVITY和ConnectivityManager.EXTRA_REASON,以获取有关收到的更改的更多信息。