是否可以在与调用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调用位置管理器?
答案 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());
然后,您将获得与从活动中调用它相同的行为!!!