我有一个尝试获取用户位置的线程。
当收到位置时,调用“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);
}
}
答案 0 :(得分:3)
最有可能发生这种情况,因为您在将邮件发布到Looper.quit()
后立即致电Handler
。这有效地终止了Handler
有机会处理它之前的消息队列操作。向Handler
发送消息只是将其发布到消息队列。处理程序将在Looper
的下一次迭代中检索消息。如果您的目标是在收到位置更新后终止该主题,那么最好从Looper.quit()
内部调用handleMessage()
。
<强>编辑强>
此外,如果站起来这个帖子的唯一目的是等待位置更新进来,那就没必要了。 LocationManager.requestLocationUpdates()
是一个固有的异步过程(获取位置修复时不会阻止您的主线程)。您可以安全地直接使用您的活动/服务实施LocationListener
并在那里获得位置值。
HTH