位于服务中的LocationManager - 如果在1分钟内没有修复,则需要停止

时间:2011-04-11 15:33:34

标签: android

我有定期服务,每隔5分钟开始使用闹钟。 Service实现LocationListener以获取GPS修复并将其保存到SqLite数据库中。

我提供服务1分钟以获得最佳解决方案。如果我在此之前得到准确度<20,那就更好了。

一切正常。我也有代码检查GPS是否已禁用,因此我退出服务。

我想要做的是:如果1分钟内没有修复 - 我想退出服务。目前,由于大多数逻辑(时间检查等)都在onLocationChanged中 - 我从来没有机会这样做,因为我从来没有获得位置。

是否有计时器或我可以使用的东西?我是Java的新手,例子会很好。我这样看:开始时我用回调创建计时器,在这个回调函数中我将清理并关闭。我不确定是否会对onLocationChanged运行产生任何影响?

我可以在获得onLocationChanged时立即禁用计时器吗?

2 个答案:

答案 0 :(得分:3)

使用android.os.Handler

Handler timeoutHandler = new Handler();
timeoutHandler.postDelayed(new Runnable() {
    public void run() {
        stopSelf();
    }
}, 60 * 1000);

答案 1 :(得分:2)

您可以使用TimerTimerTask安排超时,如下所示......

在服务中声明全局Timer对象引用:

Timer timeout = null;

在onStartCommand()中,实例化此Timer并安排TimerTask在一分钟内执行。在您从所需提供商注册位置更新后执行此操作:

timeout = new Timer();
timeout.schedule(timeoutTask, 60000);

在Service类中的某处定义timeoutTask,例如:

private TimerTask timeoutTask = new TimerTask() {
    public void run() {
        // Handle timeouts here
    }
}

如果在Timer到期之前通过onLocationChanged()获得回调,则需要停止执行timeoutTask,因此在onLocationChanged()内部:

if(timeout != null) {
    timeout.cancel()
}

然后正常处理onLocationChanged()内的位置,或者调用另一种方法来执行此操作,直到您。

可能有更好的方法可以做到这一点,但这很简单,并且在我的项目中对我有用:)希望它也能帮到你。

一切顺利, 德克兰