2012-03-13 100 views
2

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

我曾尝试:

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

它不断给我的错误:

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

可以在在一个单独的线程,或做外景经理需要的服务中后台管理程序运行从活动中调用?

回答

3

您不必在主线程上收到更新,但您必须拥有有效的Looper底层服务可以使用该服务将回调传递到内部Handler。本质上,如果你在主线程上做了所有事情,那么这个线程已经连接了一个活动的Looper

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

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

HTH

2

我发现,如果从服务以这种方式拨打requestLocationUpdates

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

然后你会,如果你从活动中调用它获得相同的行为!

+0

'Looper.getMainLooper()'做到了;确保在线程中使用它 – msysmilu 2015-04-14 14:48:30