2013-06-18 56 views
1

我開發了一個應用程序作爲處理基本HTTP請求的服務。當手機接收像一個HTTP POST請求:http ://IP:port/gps/on,就應該註冊到GPS監聽器類似如下:GPS中的LocationManager requestLocationUpdates()Android

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

但是,由於這一行代碼的處理程序中,我得到了以下錯誤:

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) 

如果我必須爲此使用處理程序/ Looper,請讓我知道嗎?以及如何做到這一點的任何例子。提前致謝!

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中,我將一個額外的字符串傳遞給我的服務並再次啓動服務。在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

這是一個Android服務 – user1741274

+0

對不起。檢查我編輯的答案.. – Riser

+0

謝謝..這是否意味着你將它帶到UI線程?我應該在哪裏離開Looper? – user1741274

1

你得到的錯誤是因爲

註冊GPS代碼是由處理HTTP請求的一類叫做你正試圖從需要主線程的後臺線程運行某些東西。您提供的代碼不會顯示此線程的設置,但要將位置設置回UI /主線程,您應該可以使用runOnUiThread創建一個新的runnable,如下所示。

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

又一個評論,你提到GPS,UI /主線程的操作,和HTTP POST它只是聽起來像這可能使用AsyncTask成立。我不得不看更多的代碼,但如果你沒有仔細研究它,那可能會讓你的生活更輕鬆。

+0

我想我不能使用service中的runOnUiThread()。請讓我知道你的建議 – user1741274

+0

我不認爲這個陳述是100%正確的。 'runOnUiThread'是一個'Activity'方法,所以我敢打賭,只要你把適當的上下文傳遞給你的服務,就可以達到它。但是,萬一我錯了,[這裏是一個關於在服務中使用runnable vs活動]的帖子(http://stackoverflow.com/questions/14808640/does-a-runnable-in-a-service-run -u-ui-thread)以及如何從兩者訪問UI線程。 – Rarw

相關問題