Запрос LocationManagerLocationUpdates () в 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; 
}

person user1741274    schedule 18.06.2013    source источник
comment
Куда ты звонишь? Обычно это просто означает, что вам нужно использовать поток пользовательского интерфейса, а не выполнять операцию в фоновом режиме.   -  person Rarw    schedule 18.06.2013
comment
Нужно увидеть больше кода, где вы разместили requestLocationUpdates, я думаю, в обработчике или в каком-то другом виде. Показать больше кода.   -  person Siddharth    schedule 18.06.2013
comment
@Rarw Привет, спасибо за ответ. У меня есть поток, который создает класс, который обрабатывает все запросы. Внутри обработчика POST мне нужно зарегистрироваться для GPS с прослушивателем. Это мое требование.   -  person user1741274    schedule 18.06.2013


Ответы (3)


Ошибка, которую вы получаете, связана с тем, что вы пытаетесь запустить что-то из фонового потока, для которого требуется основной поток. Предоставленный вами код не показывает мне настройку этого потока, но чтобы вернуть расположение обратно в пользовательский интерфейс/основной поток, вы должны просто создать новый исполняемый файл с помощью runOnUiThread, как показано ниже.

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

Просто еще один комментарий, что вы упоминаете GPS, действия пользовательского интерфейса / основного потока и сообщение HTTP, это просто звучит так, как будто это можно настроить с помощью AsyncTask. Мне нужно увидеть больше кода, но это может облегчить вашу жизнь, если вы еще не изучали его.

person Rarw    schedule 18.06.2013
comment
Я думаю, что не могу использовать runOnUiThread() из службы. Пожалуйста, дайте мне знать ваши предложения - person user1741274; 19.06.2013
comment
Я не думаю, что это утверждение на 100% верно. runOnUiThread — это метод Activity, поэтому я готов поспорить, что вы можете получить его, если передадите соответствующий контекст своей службе. Однако, если я ошибаюсь, вот сообщение об использовании runnable в службе и активности и о том, как получить доступ к потоку пользовательского интерфейса из обоих. - person Rarw; 19.06.2013

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);
    }
person Sagar Maiyad    schedule 18.06.2013
comment
Спасибо .. Означает ли это, что вы переносите его в поток пользовательского интерфейса? Где я должен выйти из Looper здесь? - person user1741274; 18.06.2013

В моем обработчике сообщений я передал дополнительную строку своей службе и снова запустил службу. В onStartCommand() я получаю дополнительную информацию от намерения, а затем вызываю requestLocationUpdates(), поэтому это делается в основном потоке. Это решило мое требование. Спасибо всем за помощь!

person user1741274    schedule 20.06.2013