2016-12-21 1 views
1

I est la première fois que je travaille avec le directeur de l'emplacement et je reçois toujours la même erreur:ne peut pas créer gestionnaire intérieur thread qui n'a pas appelé Looper.prepare() sur LocationManager en service

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

Cela se produit lorsque j'appelle .requestLocationUpdates sur un gestionnaire de position. Je ne sais pas comment puis-je mettre cela dans le fil principal de l'interface utilisateur. Voici le code du service où l'erreur se produit:

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

Voici comment je commence mon service, puis se lier à elle:

@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

double possible de [Impossible de créer gestionnaire intérieur thread qui n'a pas appelé Looper.prepare()] (http://stackoverflow.com/questions/3875184/cant-create-handler- inside-thread-that-has-not-called-looper-prepare) – Destrif

Répondre

1

Vous pouvez ajouter le code à exécuter sur l'interface utilisateur principale Enfilez comme ceci:

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

Où devrais-je utiliser ceci? dans le service ou dans l'activité qui démarre le service? –