2013-06-18 2 views
1

기본 HTTP 요청을 처리하는 서비스로 애플리케이션을 개발했습니다. 전화가 같은 HTTP POST 요청을 수신 할 때이 코드는 핸들러 내부에, 나는 아래의 오류를 얻고있다 존재로,GPS Android의 LocationManager requestLocationUpdates()

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

:하지만 http ://IP:port/gps/on, 다음과 같은 GPS 수신기에 등록해야

8.614: E/AndroidRuntime(21211): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
06-18 12:34:58.614: E/AndroidRuntime(21211): at android.os.Handler.<init>(Handler.java:121) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at com.example.devicecommunication.ConnectService$HttpFileHandler.registerGPS(ConnectService.java:4281) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at com.example.devicecommunication.ConnectService$HttpFileHandler.handle(ConnectService.java:700) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at org.apache.http.protocol.HttpService.doService(HttpService.java:243) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:187) 
06-18 12:34:58.614: E/AndroidRuntime(21211): at com.example.devicecommunication.ConnectService$WorkerThread.run(ConnectService.java:4987) 

처리기/루퍼를 사용해야하는지 알려주십시오. 그리고 이것을하는 방법에 대한 예. 미리 감사드립니다!

public String registerGPS(){ 
String gps= ""; 
if(!gpsSensor){ 
if(isGpsOn(appContext)) 
{ 
Log.d("GPS on","Using GPS Provider here"); 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,200,0,locationListener); 
gps = "***********GPS Provider registered here *********************"; 
} 
else 
{ 
Log.d("GPS off","using NETWORK Provider here"); 
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,200,0,locationListener); 
gps = "***********Network provider registered here *********************"; 
} 
} 
gpsSensor = true; 
return gps; 
} 
+0

어디에서 전화 하시겠습니까? 이 사용법은 UI 스레드를 사용해야하고 백그라운드에서 작업을 수행하지 않아도된다는 것을 의미합니다. – Rarw

+0

더 많은 코드를 볼 필요가 있습니다. 어디에서 requestLocationUpdates를 가져 왔는지, 핸들러 또는 일종의 것으로 추측합니다. 더 많은 코드를 표시하십시오. – Siddharth

+0

@Rarw 안녕하세요, 답장을 보내 주셔서 감사합니다. 모든 요청을 처리하는 클래스를 만드는 스레드가 있습니다. POST 처리기에서 수신기와 함께 GPS에 등록해야합니다. 이것은 나의 요구 사항이다. – user1741274

답변

0

내 Handler for Post에서 서비스에 여분의 String을 전달하고 서비스를 다시 시작했습니다. onStartCommand()에서 인 텐트에서 여분을 얻은 다음 requestLocationUpdates()를 호출하여 주 스레드에서 수행합니다. 이것은 나의 요구 사항을 해결했다. 도와 주신 모든 분들께 감사드립니다!

0
public class LocationLog extends Thread { 
    LocationManager lm; 
    LocationHelper loc; 
    String latString, lngString = null; 

    public LocationLog(Context context, String latString, String lngString) { 
     loc = new LocationHelper(); 
     lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 
    } 

    public void run() { 
     Looper.prepare(); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc); 
     Looper.loop(); 
    } 
} 

다음 서비스 클래스에서 사용 :

private void LocationLog() { 
     new LocationLog(context, latString, lngString).start(); 
     Log.d(latString, getClass().getSimpleName()); 
     Log.d(lngString, getClass().getSimpleName()); 
     retrieveUserId(); 
     sendData(user_id); 
    } 
+0

안드로이드 서비스입니다. – user1741274

+0

죄송합니다. 편집 된 답변을 확인하십시오. – Riser

+0

감사합니다. UI 스레드로 가져 오는 중입니까? 여기서 루퍼를 어디에서 끝내야합니까? – user1741274

1

당신이지고있어 오류가 있기 때문입니다 GPS를 등록

코드는 HTTP 요청을 처리하는 클래스에 의해 호출된다 주 스레드가 필요한 백그라운드 스레드에서 뭔가를 실행하려고합니다. 제공 한 코드가이 스레드의 설정을 표시하지는 않지만 UI/Main 스레드로 다시 설정된 위치를 얻으려면 runOnUiThread를 사용하여 다음과 같이 새 실행 파일을 만들 수 있어야합니다. 이것이 AsyncTask를 사용하여 설정할 수 있었던 것처럼

private Runnable runnable = new Runnable() { 
public void run() { 
    runOnUiThread(new Runnable() { 
     public void run(){ 
      //set up your listener here 
     } 
    }); 
} 

그냥 다른 의견, 당신은 GPS, UI/메인 스레드의 작업을 언급하고 HTTP를 게시 할 것을 그냥 소리가 난다. 나는 더 많은 코드를보아야 할 것이다.하지만 그 코드를 들여다 보면 그만한 삶이 더 쉬워 질 것이다.

+0

나는 service에서 runOnUiThread()를 사용할 수 없다고 생각한다. 제 제안을 알려주십시오. – user1741274

+0

저는 그 문장이 100 % 정확하다고 생각하지 않습니다. 'runOnUiThread'는'Activity' 메소드입니다. 그래서 당신이 당신의 서비스에 적절한 문맥을 전달할 때까지 당신이 접근 할 수있을 것이라고 확신 할 수 있습니다. 그러나, 내가 틀렸다면, [여기 서비스에 runnable 사용에 대한 게시물 대 활동] (http://stackoverflow.com/questions/14808640/does-a-runnable-in-a-service-run -in-the-ui-thread)와 둘 다에서 UI 스레드에 액세스하는 방법에 대해 설명합니다. – Rarw

관련 문제