我要做的事情:
1) 每x分钟更新一次用户的位置信息
2) 使用计时器和TimerTask调用记录最新位置信息的web服务
发生了什么:
1) TimerTask已创建
2) 如果用户的手机处于休眠状态,则对网络服务的呼叫不起作用
3) TimerTask似乎存储在队列中
4) 当用户的手机唤醒时,所有排队的TimerTask都会立即执行,从而导致针对web服务的多个不需要的位置更新
以下是代码片段:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try
{
//validate that the device has an active & working connection
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = connMgr.getActiveNetworkInfo();
//validate the the device network provider is enabled
if ((eview_locationManagerwifi
.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) && (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED))
{
UpdateSubscriberLocation(); // call the web service to report location data
}
else
{
this.cancel();
}
}
catch (Exception e)
{
}
网络连接和提供商已启用检查显然都返回"true",因为TimerTask不会被取消,它只是被排队,直到用户的手机唤醒。
如果已经过了一段时间而web服务没有响应,我如何取消TimerTask?我在TimerTask上找不到某种"setTimeout"方法。
不要使用TimerTask,使用LocationManager.requestLocationUpdates()。这与TimerTask不同,它大大简化了代码。如果用户位置不变,您还可以获得避免工作的额外好处。
如果您需要快速更新,请使用WakeLock来防止设备关闭CPU。有关详细信息,请参见此处:http://developer.android.com/reference/android/os/PowerManager.html
如果您不需要快速更新(比如每隔一分钟使用一次AlarmManager)。如果报警被触发,请请求位置更新,发送您的数据并设置下一个报警:http://developer.android.com/reference/android/app/AlarmManager.html