位置经理内部服务

时间:2012-03-13 22:06:02

标签: android multithreading service gps locationmanager

是否可以在与调用startService的线程不同的线程中的服务内请求位置更新?

我试过了:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

它一直给我错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

后台管理器可以在单独线程中的服务内运行,还是需要从Activity调用位置管理器?

2 个答案:

答案 0 :(得分:3)

您不一定必须在主线程上接收更新,但您必须拥有基础服务可用于通过内部Looper传递回调的有效Handler。本质上,如果您在主线程上执行所有操作,那么您就是好的,因为此线程已经附加了活动Looper

查看Looper的文档,因为它们解释了如何使用有效实例设置后台线程,以便可以将其用于此目的。还有requestLocationUpdates()版本需要Looper个对象。您可以在传递requestLocationUpdates()的结果时调用Looper.getMainLooper(),以允许在主线程上处理回调,即使您可能无法直接从该线程附加侦听器。

另外,请记住,位置更新本质上是异步的,并且不会因为您在那里注册回调而阻塞主线程。这可能不是你对此感兴趣的原因,但我认为值得一提。

HTH

答案 1 :(得分:2)

我发现如果您以这种方式从服务中致电requestLocationUpdates

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLoclistener, Looper.getMainLooper());

然后,您将获得与从活动中调用它相同的行为!!!