我有定期服务,每隔5分钟开始使用闹钟。 Service实现LocationListener以获取GPS修复并将其保存到SqLite数据库中。
我提供服务1分钟以获得最佳解决方案。如果我在此之前得到准确度<20,那就更好了。
一切正常。我也有代码检查GPS是否已禁用,因此我退出服务。
我想要做的是:如果1分钟内没有修复 - 我想退出服务。目前,由于大多数逻辑(时间检查等)都在onLocationChanged中 - 我从来没有机会这样做,因为我从来没有获得位置。
是否有计时器或我可以使用的东西?我是Java的新手,例子会很好。我这样看:开始时我用回调创建计时器,在这个回调函数中我将清理并关闭。我不确定是否会对onLocationChanged运行产生任何影响?
我可以在获得onLocationChanged时立即禁用计时器吗?
答案 0 :(得分:3)
Handler timeoutHandler = new Handler();
timeoutHandler.postDelayed(new Runnable() {
public void run() {
stopSelf();
}
}, 60 * 1000);
答案 1 :(得分:2)
您可以使用Timer和TimerTask安排超时,如下所示......
在服务中声明全局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()内的位置,或者调用另一种方法来执行此操作,直到您。
可能有更好的方法可以做到这一点,但这很简单,并且在我的项目中对我有用:)希望它也能帮到你。
一切顺利, 德克兰