问候,
我正在尝试实现一个定时器,每10秒钟向我的服务器发送一次GPS坐标.
以下是我正在实施的服务的代码片段:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Timer timer=new Timer();
TimerTask tt=new TimerTask(){
@Override
public void run() {
Location loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
sendCoords(String.valueOf(loc.getLatitude()), String.valueOf(loc.getLongitude()));
Toast.LENGTH_SHORT).show();
Log.i("EOH",String.valueOf(loc.getLatitude()));
}
};
timer.schedule(tt,0,10000);
return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是run()内的任何内容都会导致我的应用程序强制关闭.
这是LogCat转储:
12-28 18:44:18.284:ERROR/AndroidRuntime(6537):致命异常:Timer-0 12-28 18:44:18.284:ERROR/AndroidRuntime(6537):java.lang.RuntimeException:无法在里面创建处理程序没有调用Looper.prepare()的线程12-28 18:44:18.284:ERROR/AndroidRuntime(6537):在android.os.Handler.(Handler.java:121)12-28 18:44:18.284:ERROR/AndroidRuntime(6537):在prestocab.driver.Background $ 2.(Background.java:83)12-28 18:44:18.284:ERROR/AndroidRuntime(6537):at prestocab.driver.Background.sendCoords(Background.java: 83)12-28 18:44:18.284:ERROR/AndroidRuntime(6537):在prestocab.driver.Background $ 3.run(Background.java:114)12-28 18:44:18.284:ERROR/AndroidRuntime(6537): at java.util.Timer $ TimerImpl.run(Timer.java:289)12-28 18:44:18.554:ERROR/WindowManager(1310):return in RemoveWindowLocked
任何人都可以建议修复此问题吗?
我已尝试使用locationManager onLocationChanged()函数,但我无法将间隔设置为10秒.显然,指定的时间只是一个指导,操作系统决定什么是最好的.即使我将间隔设置为100秒,它也会每隔一秒钟给我一个位置.因此我使用计时器的原因.
我希望有人能提出一些建议.
提前致谢,
我正在尝试实现一个定时器,每10秒钟向我的服务器发送一次GPS坐标.
这是不现实的.您可能根本没有得到任何修复.你可能不会得到修复,直到10秒钟.例如,我正在测试旨在帮助开发人员以更低的频率(例如,每小时一次)轮询位置更新的服务,并且即使从手机上也可以轻松地花费一分钟来修复坐在一个窗口.
以下是我正在实施的服务的代码片段:
这是有缺陷的.对于初学者来说,getLastKnownLocation()通常会null超出你的Timer/ TimerTask问题.
我希望有人能提出一些建议.
我将首先重新设计您的应用程序,以摆脱10秒概念作为一项艰难的要求.
然后,使用requestLocationUpdates().如果读数太多,请忽略您不想要的读数,不要将它们发送到服务器.当然,请在短时间内运行,并且仅基于积极的用户请求(例如,明确地运行您的应用程序),考虑到保持GPS无线电开启所涉及的电池消耗.
该文件requestLocationUpdates()在时间方面肯定令人困惑 - 我最近才意识到最短时间不一定得到尊重.