1

我正在尝试做的事情:

1) 每 x 分钟更新一次用户的位置信息

2) 使用计时器和 TimerTask 调用记录最新位置信息的网络服务

发生了什么:

1) TimerTask 被创建

2) 如果用户的手机处于休眠/睡眠状态,则无法调用 Web 服务

3) TimerTask 似乎被存储在队列中

4) 当用户的手机唤醒时,所有排队的 TimerTasks 立即执行,导致针对 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)
    {


    }

网络连接和启用提供程序的检查显然都返回“真”,因为 TimerTask 没有被取消,它只是排队等待用户的手机唤醒。

如果在一段时间内没有来自 Web 服务的响应,我如何取消 TimerTask?我无法在 TimerTask 上找到一种“setTimeout”方法。

4

2 回答 2

0

如果您需要快速更新,请使用 WakeLock 来防止设备关闭 CPU。详见此处:http: //developer.android.com/reference/android/os/PowerManager.html

如果您不需要快速更新(假设每隔一分钟使用 AlarmManager。如果触发警报请求位置更新,请发送您的数据并设置下一个警报:http: //developer.android.com/reference/android/应用程序/AlarmManager.html

于 2012-03-08T08:28:41.790 回答
0

不要使用 TimerTask,使用 LocationManager.requestLocationUpdates()。这不像 TimerTask 那样加起来,它大大简化了代码。如果用户的位置没有改变,您还可以获得避免工作的额外好处。

于 2012-03-07T20:55:36.273 回答