LocationManager和Looper - 每个线程只能创建一个Looper

时间:2011-12-09 07:48:05

标签: android location looper

我的应用有问题。我需要在某个时间间隔内获得位置更新,因此基本上需要能够很好地控制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个小时才能发布答案大声笑。 感谢您的任何意见和回复。

2 个答案:

答案 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。