LocationManager requestLocationUpdates() в GPS Android
Я разработал приложение как сервис, который обрабатывает основные HTTP-запросы. Когда телефон получает запрос HTTP Post, например: http ://IP:port/gps/on
, он должен зарегистрироваться на приемнике GPS следующим образом:
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 для этого? И любой пример того, как это сделать. Заранее спасибо!
Код для регистрации GPS вызывается классом, который обрабатывает HTTP-запросы:
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;
}
3 ответа
В своем обработчике для почты я передал дополнительную строку своему сервису и снова запустил сервис. В onStartCommand () я получаю дополнительную информацию из намерения, а затем вызываю requestLocationUpdates (), так что это делается в основном потоке. Это решило мое требование. Спасибо всем за помощь!
Ошибка, которую вы получаете, заключается в том, что вы пытаетесь запустить что-то из фонового потока, для которого требуется основной поток. Код, который вы предоставили, не показывает мне настройку этого потока, но чтобы вернуть расположение обратно потоку UI/Main, вы должны иметь возможность просто создать новый runnable, используя runOnUiThread, как показано ниже.
private Runnable runnable = new Runnable() {
public void run() {
runOnUiThread(new Runnable() {
public void run(){
//set up your listener here
}
});
}
Еще один комментарий, в котором вы упомянули действия GPS, UI/Main thread и публикацию HTTP, просто звучит так, как будто это можно настроить с помощью AsyncTask
, Мне нужно было бы увидеть больше кода, но это могло бы облегчить вашу жизнь, если бы вы не изучили его в алради.
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);
}