在检查网络是否可用时,我遇到了获得一致结果的问题。
我在AppPreferences类中使用此代码段来检查网络的可用性。
/**
* @return the networkAvailable
*/
public boolean isNetworkAvailable() {
connectionManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
networkAvailable = connectionManager.getActiveNetworkInfo() != null && connectionManager.getActiveNetworkInfo().isConnected();
return networkAvailable;
}
在每次运行之前,我将上下文设置如下:
timer.scheduleAtFixedRate(
new TimerTask() {
public void run() {
appPreferences.setContext(getBaseContext());
if (appPreferences.isNetworkAvailable()){
// perform task
}
}
},
0,
UPDATE_INTERVAL);
我知道它没有绑定到后台线程,因为我有一个onReceive调用做同样的逻辑,但仍然检查失败。
当它在蜂窝数据连接和wifi之间移动时,似乎主要发生,反之亦然。即使我更新它,它启动的上下文似乎仍然存在。
有谁知道这里有什么问题?
答案 0 :(得分:1)
似乎活动网络信息将保持服务/活动/接收器的上下文启动时的状态。因此,如果您在网络上启动它,然后再断开连接(即从3G移动到Wifi并断开3G连接),它将保持第一个活动连接,使应用程序认为手机处于脱机状态,即使它不是。
在我看来,最好的解决方案是使用getApplicationContext,因为当你启动特定的“任务”时,它不会被束缚。
更新:相关的是,如果您在连接到Wifi时长时间在Androids(特别是Nexus One)上运行应用程序请检查您是否确保不要让Wifi睡眠当屏幕睡觉时您可以在无线网络下的高级选项中进行设置。