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