2016-07-12 4 views
0

Я пытаюсь получить координаты GPS с помощью обработчика. Ниже приведен код:Невозможно получить координаты GPS в фоновом режиме (с помощью Handler) - Android

final Thread ObainGpsBackground = new Thread(new Runnable() { 

      @Override 
      public void run() { 
        try{ 
         String SetServerString = ""; 
         //Obtaining GPS co-ordinates : 
         LatLong obj_latLong = new LatLong(getActivity()); 
         addressList = obj_latLong.getListAddressFromGeocoder(getActivity()); 

         //Setting the addressList.getLatitude() into a variable "SetServerString" 
         for (Address address : addressList) { 
          SetServerString = String.valueOf(address.getLatitude()); 
          threadMsg(SetServerString); 
         } 
         //Obtaining GPS co-ordinates : 
        } 
        catch(Throwable t){ 
        Log.i("Exception","Getting GPS exception : "+t); 
       } 
      } 
     }); 

Как-то код всегда перемещается к блоку catch. Все, что я получаю эту ошибку:

I/Exception: Getting GPS exception : java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Вот обработчик:

private void threadMsg(String setServerString) { 
     if (!setServerString.equals("") && !setServerString.equals("0")) { 
      Message msgObj = handler.obtainMessage(); 
      Bundle b = new Bundle(); 
      b.putString("message", setServerString); 
      msgObj.setData(b); 
      handler.sendMessage(msgObj); 
     } 
    } 

    private final Handler handler = new Handler() { 

     public void handleMessage(Message msg) { 

      String aResponse = msg.getData().getString("message"); 

      if ((null != aResponse)) { 

       // ALERT MESSAGE 
//    alert_attendance(getResources().getString(R.string.warning), getResources().getString(R.string.ects)); 
       Toast.makeText(getActivity(), "Response: "+aResponse, Toast.LENGTH_SHORT).show(); 
      } 
      else 
      { 

       // ALERT MESSAGE 
       alert_attendance(getResources().getString(R.string.warning), getResources().getString(R.string.unableToFindLocation)); 
//    Toast.makeText(getBaseContext(), "Not Got Response From Server.", Toast.LENGTH_SHORT).show(); 

      } 
     } 
    }; 

посещение различных сообщений. Как-то не удалось это понять. Как точно реализовать looper.prepare()? Есть идеи ?

+0

@Tim Отредактировано мое сообщение. Как-то код удалился во время публикации. – TechFrk

+0

На какой линии возникает проблема? показать полный журнал сбоев –

+0

Я упомянул в своем коде: 'catch (Throwable t) { Log.i (" Исключение "," Получение исключения GPS: "+ t);' Компилятор выполняет этот блок. Это все журнал аварий, который я получаю. – TechFrk

ответ

0

Это происходит потому, что не Looper не был создан и подготовлен Thread и Handler требует Looper поэтому он может получать сообщения. Не видя полного кода, трудно судить его, но по сути дела происходит то, когда создается ваш Handler (при загрузке любого класса, в котором он входит, - выглядит как threadMsg), что происходит в вашем пользовательском потоке.

Если вы намерены обновить свой интерфейс, я предлагаю обновить код Activity или Fragment, чтобы опубликовать общедоступный метод предоставления обновлений на основе GPS. Еще лучше инкапсуляция будет иметь ваш GPS фон рабочий определить интерфейс для обратного вызова то, когда событие происходит:

public interface GpsEventListener { 
    void gpsEventReceived(int type, String data); 
} 

иметь свой Activity или Fragment реализует этот интерфейс и их создание Handler, который будет работать в главном потоке :

public class MyGpsActivity extends Activity implements ThreadMsg.GpsEventListener, Handler.Callback { 
    ... 
    private Handler handler = new Handler(this); 

    public boolean handleMessage(Message msg) { 
     /* do work here */ 
    } 

    public void gpsEventReceived(int type, String data) { 
     Message msg = Message.obtain(handler, type, data); 
     msg.sendToTarget(); 
    } 
} 

Будьте очень осторожны при запуске/остановке фоновой нити и взаимодействии с основной нитью. Объект Thread не знает о жизненном цикле, поэтому, когда ваш Activity или Fragment приостанавливается, вы больше не можете обновлять компоненты пользовательского интерфейса, и вы хотите остановить своего рабочего.

Я также предлагаю использовать асинхронные уведомления о данных GPS, а не опросы, подобные этому. В противном случае вы будете использовать много процессора и аккумулятора.

 Смежные вопросы

  • Нет связанных вопросов^_^