【问题标题】:Android - GPS Location Update - Need to Cancel TimerTaskAndroid - GPS 位置更新 - 需要取消 TimerTask
【发布时间】:2012-03-07 20:22:19
【问题描述】:

我正在尝试做的事情:

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

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

发生了什么:

1) TimerTask 已创建

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

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

4) 当用户的手机唤醒时,所有排队的 TimerTask 会立即执行,从而导致针对 Web 服务的多次不需要的位置更新

这里是sn-p的代码:

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”方法。

【问题讨论】:

    标签: android gps timeout timertask


    【解决方案1】:

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

    【讨论】:

    • 如果我能找到使用 TimerTask 的方法,那就太好了 - 我使用它是因为我需要定期触发此代码(用户确定)。如果用户位置没有改变,我喜欢不处理任何东西的想法,但是我如何确保代码将在不使用 Timer/TimerTask 组合的情况下以定期安排的时间间隔运行?
    • 等等,我想我可能已经找到了答案,实际上。 requestLocationUpdates() 调用包括一个固定的时间间隔,不是吗?因此,如果我在应用启动时调用此方法,它应该会继续每 x 毫秒触发一次,对吗?
    • requestLocationUpdates 的时间间隔只是给位置管理器的一个提示。您可能会获得更少或更多的位置,如果设备休眠,您将不会获得任何进一步的更新!
    • 如果设备进入休眠状态,您是说在那之后我不会再收到任何位置更新,还是会在设备唤醒后恢复?
    • Stefan 关于时间间隔是(某种)提示是正确的。我利用 minDistance 和 minTime 参数来限制要在我的应用程序中记录的数据量。如果用户没有移动,那么就没有理由更新东西。据我所知,LocationManager 包含一个 PARTIAL_WAKE_LOCK,因此它将保持 CPU 运行并在您需要时为您提供更新。
    【解决方案2】:

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

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

    【讨论】:

    • 只是为了澄清 OP 和那里的代码 sn-p:更新任务应根据用户定义的设置触发,通常每 15 分钟或每 30 分钟一次,具体取决于用户选择的内容他们的偏好设置。
    • LocationManagerService 确实包含 PARTIAL_WAKE_LOCK,所以我不需要在您的应用中包含它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多