0

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

4

2 回答 2

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" />
于 2013-04-02T14:18:37.240 回答
0

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

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

您可以检查 Intent extra ConnectivityManager.EXTRA_NETWORK_INFO、ConnectivityManager.EXTRA_OTHER_NETWORK_INFO、ConnectivityManager.EXTRA_NO_CONNECTIVITY 和 ConnectivityManager.EXTRA_REASON 以获取有关收到的更改的更多信息。

于 2013-04-02T14:17:38.720 回答