LocationManager requestLocationUpdates() in GPS Android

user1741274 picture user1741274 · Jun 18, 2013 · Viewed 10.3k times · Source

I have developed an application as a service that handles basic HTTP requests. When the phone receives a HTTP Post request like: http ://IP:port/gps/on, it should register to the GPS listener like the following:

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

But, as this code is present inside the handler, I am getting the below error:

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) 

Can you please let me know if I have to use handler/ Looper for this? And any example of how to do this. Thanks in advance!

Code to register GPS is called by a class that handles HTTP requests:

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; 
}

Answer

Rarw picture Rarw · Jun 18, 2013

The error you're getting is because you're trying to run something from a background thread that requires the main thread. The code you provided does not show me the set up of this thread but to get the location set up back to the UI/Main thread you should be able to just create a new runnable using runOnUiThread as shown below.

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

Just another comment, that you mention GPS, UI/Main thread actions, and HTTP post it just sounds like this could be set up using an AsyncTask. I'd have to see more code but that might make your life easier if you havent looked into it alraedy.