2012-03-13 2 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

메인 스레드에서 업데이트를 반드시받을 필요는 없지만 내부 서비스 Handler을 통해 기본 서비스에서 콜백을 전달하는 데 사용할 수있는 유효 Looper이 있어야합니다. 본래 스레드의 모든 작업을 수행하는 경우이 스레드의 활성 스레드가 활성 상태이므로 Looper이 이미 첨부되어 있습니다.

Looper에 대한 문서를 살펴보십시오. 올바른 목적으로 백그라운드 스레드를 설정하는 방법을 설명하므로이 용도로 사용할 수 있습니다. 의 버전에도 Looper 개체가 필요합니다. requestLocationUpdates()으로 전화를 걸어 Looper.getMainLooper()의 결과를 전달하면 주 스레드에서 콜백을 처리 할 수 ​​있지만 해당 스레드에서 직접 수신자를 연결할 수는 없습니다.

또한 위치 업데이트는 기본적으로 비동기이며 콜백을 등록했기 때문에 주 스레드를 차단하지 않습니다. 이것은 당신이 이것에 흥미있는 이유가 아닐지 모르지만, 나는 언급 할 가치가 있다고 생각했습니다.

HTH

2

난 당신이 이러한 방식으로 서비스에서 requestLocationUpdates를 호출하는 경우 발견 : 당신이 활동에서 호출하는 것처럼

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

그런 다음 같은 동작을 얻을 것이다!

+0

'Looper.getMainLooper()'; 스레드에서 사용하는 경우이를 확인하십시오. – msysmilu