我的应用有问题。我需要在某个时间间隔内获得位置更新,因此基本上需要能够很好地控制GPS模块,这对Android操作系统来说并不容易。基本上我需要以5分钟的间隔打开GPS 2分钟。我有时间下来,我可以获得该位置两次,但随后应用程序崩溃与运行时错误 - 每个线程只能创建一个Looper。时间是在服务类中完成的,并且运行良好,它会删除更新以及我正在遇到的所有问题。
我origninally有这个错误 - “无法在没有调用Looper.prepare()的线程内创建处理程序”我用下面的代码修复了,但现在我得到了唯一一个Looper错误
我的looper Thread看起来像这样(请不要苛刻,我对Android很新笑)
public void run() {
Looper.prepare();
setLooper(Looper.myLooper());
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
stopLooper();
}
}, TWO_MINUTES);
Looper.loop();
t.cancel();
setLooper(null);
vb.getLm().removeUpdates(ll);
}
就像我说我是新手,我不知道如何使用Handler。我确实从StackOverflow的帖子中获得了一些代码,只是使用了不同的方法,但是没有用。
我真的需要帮助。 感谢您的回复。
好吧我好像找到了解决方案,只需要测试一下,然后再等7个小时才能发布答案大声笑。 感谢您的任何意见和回复。
答案 0 :(得分:1)
无法理解你的代码在做什么:) 为什么不这样使用更简单的东西:
public void run( ) {
while (true) {
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
sleep(2 * 60 * 1000);
LocationManager.removeUpdates();
sleep(5 * 60 * 1000);
}
}
好的,也许是这样的?
Runnable start = new Runnable( ) {
public void run( ) {
LocationManager.startLocationUpdates
handler.postDelayed(stop, 2 * 60 * 1000L);
}
}
Runnable stop = new Runnable( ) {
public void run( ) {
LocationManager.removeLocationUpdates
}
}
Runnable onePeriod = new Runnable( ) {
public void run( ) {
handler.postDelayed(onePeriod, 5 * 60 * 1000);
handler.post(start);
}
}
public void startContiniuosListening( ) {
handler.post(onePerion);
}
public void stopContiniousListening( ) {
handler.removeCallback(stop);
handler.removeCallback(onePeriod);
LocationManager.removeLocationUpdates(...)
}
其中handler是class field:
Handler handler = new Handler();
答案 1 :(得分:0)
我发现这个类似问题的答案非常有用: https://stackoverflow.com/a/6576972/588556
基本上,你只需要将问题中的代码包装在自己的线程中......
new Thread(new Runnable() {
// Your code here...
}).start();
然后这个工作线程将创建自己的Looper。