2016-12-21 4 views
1

я это первый раз, когда я работаю с менеджером местоположения, и я всегда получаю ту же ошибку:Невозможно создать обработчик внутри потока, который не называется Looper.prepare() на locationManager в службе

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Это происходит, когда я вызываю .requestLocationUpdates в locationManager. Я не знаю, как я могу поместить это в поток основного интерфейса. Вот код сервиса, где происходит ошибка:

public class TrackerService extends Service { 
    private Context mContext; 
    private LocListener mlocListener; 
    private LocationManager mlocManager; 
    private final IBinder myBinder = new MyLocalBinder(); 

    public void initiateTracking() { 
     this.mContext = getApplicationContext(); 
     mlocManager = (LocationManager) this.mContext.getSystemService(Context.LOCATION_SERVICE); 
     mlocListener = new LocListener(); 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
    } 

    public Boolean getGPSStatus(){ 
     return mlocManager.isProviderEnabled(mlocManager.GPS_PROVIDER); 
    } 

    public Double[] getCurrentLocation(){ 
     Double[] lonLat = new Double[]{mlocListener.getLon(), mlocListener.getLat()}; 
     Log.d("DEBUG", "getCurrentLocation: " + lonLat); 
     return lonLat; 
    } 

    public class MyLocalBinder extends Binder { 
     public TrackerService getService() { 
      return TrackerService.this; 
     } 
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return myBinder; 
    } 
    @Override 
    public void onCreate() 
    { 
     isRunning = true; 
    } 
    @Override 
    public int onStartCommand(final Intent intent, int flags, int startId) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       initiateTracking(); 
      } 
     }).start(); 

     return Service.START_STICKY; 
    } 
    @Override 
    public void onDestroy() { 
     isRunning = false; 
    } 
} 

Вот как я начинаю свою службу, а затем привязать к нему:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     startService(new Intent(this, TrackerService.class)); 
     bindService(new Intent(MainActivity.this, TrackerService.class), myConnection, Context.BIND_AUTO_CREATE); 
    } 
+0

Возможный дубликат [Невозможно создать обработчик внутри потока, который не называется Looper.prepare()] (http://stackoverflow.com/questions/3875184/cant-create-handler- in-thread-that-has-not-called-looper-prepare) – Destrif

ответ

1

Вы можете добавить код для запуска на главном интерфейсе Тема так:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      //your code here 
      } 
    }); 
+0

Где я должен использовать это? в сервисе или в действии, который начинает обслуживание? –

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

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