handleMessage没有被调用

时间:2011-10-15 15:29:11

标签: android

我有一个尝试获取用户位置的线程。

当收到位置时,调用“handler.sendMessage(msg)”,它返回true,但永远不会调用handleMessage。

logcat中没有错误或警告。

代码:

public class LocationThread extends Thread implements LocationListener {
    // ... Other (non-relevant) methods

    @Override
    public void run() {
        super.run();

        Looper.prepare();
        mainHandler = new Handler(Looper.myLooper()) {
            @Override
            public void handleMessage(Message msg) {
                // This method is never called
            }
        };
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 0, 0, this);
        Looper.loop();
    }

    @Override
    public void onLocationChanged(Location location) {
        // SendMessage is executed and returns true
        mainHandler.sendMessage(msg);
        if (mainHandler != null) {
            mainHandler.getLooper().quit();
        }
        locationManager.removeUpdates(this);
    }
}

1 个答案:

答案 0 :(得分:3)

最有可能发生这种情况,因为您在将邮件发布到Looper.quit()后立即致电Handler。这有效地终止了Handler有机会处理它之前的消息队列操作。向Handler发送消息只是将其发布到消息队列。处理程序将在Looper的下一次迭代中检索消息。如果您的目标是在收到位置更新后终止该主题,那么最好从Looper.quit()内部调用handleMessage()

<强>编辑

此外,如果站起来这个帖子的唯一目的是等待位置更新进来,那就没必要了。 LocationManager.requestLocationUpdates()是一个固有的异步过程(获取位置修复时不会阻止您的主线程)。您可以安全地直接使用您的活动/服务实施LocationListener并在那里获得位置值。

HTH