2

我的应用程序有问题。我需要在某个时间间隔获取位置更新,因此基本上需要能够很好地控制 GPS 模块,这对于 Android 操作系统来说并不容易。基本上我需要每隔 5 分钟打开 GPS 2 分钟。我有计时,我可以两次获得位置,但随后应用程序因运行时错误而崩溃 - 每个线程只能创建一个 Looper。时间安排在服务类中完成并且运行良好,它删除了更新以及我遇到的所有问题。

我最初遇到了这个错误-“无法在没有调用 Looper.prepare() 的线程内创建处理程序”,我用下面的代码修复了这个错误,但现在我得到了唯一的一个 Looper 错误

我的 looper 线程看起来像这样(请不要苛刻,我对 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);

    }

就像我说的我是新手,我不知道如何使用处理程序。我确实从 StackOverflow 的一篇文章中得到了一些代码,只是用不同的方式使用它,但它不起作用。

请我真的需要帮助。感谢您的任何回复。

好的,我似乎找到了解决方案,只需要对其进行测试,然后再等待 7 个小时,我就可以发布答案了,哈哈。感谢您的任何意见和回复。

4

2 回答 2

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 是类字段:

Handler handler = new Handler();
于 2011-12-09T08:00:53.140 回答
0

我发现这个类似问题的答案非常有帮助: https ://stackoverflow.com/a/6576972/588556

基本上,您只需将问题中的代码包装在自己的线程中......

new Thread(new Runnable() {
    // Your code here...
}).start();

然后这个工作线程会创建自己的 Looper。

于 2012-12-10T01:33:08.073 回答