【发布时间】:2013-04-02 14:11:53
【问题描述】:
我有一个小型 android 应用程序向服务器发出一些 POST 请求问题是我希望我的应用程序能够在请求失败时在检查网络的可用性后重试 Post设备。如何做到这一点?有必要实现服务和数据库来持久化我发送的数据吗?我已经阅读了有关警报管理器的内容,但我不知道如何通过我的活动来实现这一点。
【问题讨论】:
标签: android rest service httprequest alarmmanager
我有一个小型 android 应用程序向服务器发出一些 POST 请求问题是我希望我的应用程序能够在请求失败时在检查网络的可用性后重试 Post设备。如何做到这一点?有必要实现服务和数据库来持久化我发送的数据吗?我已经阅读了有关警报管理器的内容,但我不知道如何通过我的活动来实现这一点。
【问题讨论】:
标签: android rest service httprequest alarmmanager
您不一定需要始终运行的服务。当 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" />
【讨论】:
创建一个扩展 BroadcastReceiver 的类,然后像这样注册该类: registerReceiver(new BroadcastReceiverExtension, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
网络上的任何变化都会触发这个广播。
您可以查看 Intent extras ConnectivityManager.EXTRA_NETWORK_INFO、ConnectivityManager.EXTRA_OTHER_NETWORK_INFO、ConnectivityManager.EXTRA_NO_CONNECTIVITY 和 ConnectivityManager.EXTRA_REASON,了解有关收到的更改的更多信息。
【讨论】: