2010-07-06 6 views
2

J'ai des difficultés à faire fonctionner le GPS onLocationChanged sur un thread différent. Je comprends comment gérer le thread UI lorsque j'appelle une fonction mais avec le GPS, je n'appelle pas la fonction de façon active.Rappel GPS Android sur le fil de l'interface utilisateur

Mon intention est d'avoir un flash lumineux chaque fois que le GPS reçoit une lecture. J'ai mis cette fonction dans un runnable. J'ai passé cette fonction à une classe qui implémente LocationListener. Ensuite, dans la classe principale, j'ai démarré un nouveau thread qui appelle requestLocationUpdates. J'espérais que onLocationChanged de LocationListener s'exécuterait dans un thread différent, publier dans le rappel et effectuer les effets d'interface utilisateur nécessaires dans le thread d'interface utilisateur. Malheureusement, le programme se bloque chaque fois qu'il essaie d'appeler requestLocationUpdates. Quelle est la bonne façon de le faire?

En ce moment, il ressemble à quelque chose comme ça

Classe principale:

final Runnable changeLight = new Runnable(){ 
     public void run(){ 
      // do stuff 
     } 
    }; 

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

     status = (ImageView) findViewById(R.id.status); 
     database = new DatabaseManager(this); 

     new Thread(){ 
      public void run(){ 
       location = (LocationManager) getSystemService(LOCATION_SERVICE); 
       listener = new GPSManager(database, changeLight, light, status); 
       location.requestLocationUpdates("gps", 10000L, 0, listener); 
      } 
     }.start(); 
    } 

classe LocationListener:

public void onLocationChanged(Location location) { 
     if (location.getAccuracy() <= 32.0){ 
      light = lightColors.Green; 
      status.post(callback); 
      database.insertData(location); 
     } 
     else{ 
      light = lightColors.Yellow; 
      status.post(callback); 
     } 
    } 

L'exception dit ne peut pas créer gestionnaire intérieur thread qui n'a pas appelé Looper .prepare()

Répondre

2

Le fil où vous appelez location.requestLocationUpdates doivent avoir un Looper (voir here). Vous pouvez utiliser HandlerThread au lieu de Thread.

0

Vos problèmes pourraient-ils survenir? synchronisation incorrecte du thread principal? Avez-vous des exceptions avant que l'application ne se bloque? Pouvez-vous poster un exemple conforme à sscce.org?

En général, lorsque vous traitez des événements asynchrones sur l'interface graphique, vous devriez avoir une bonne synchronisation: http://developer.android.com/resources/articles/painless-threading.html

+0

J'ai ajouté le code et l'exception – xster

1

Je courais dans le même problème. La solution s'avère être que le nouveau thread dans lequel vous souhaitez recevoir des mises à jour d'emplacement à partir du gestionnaire de position doit être un thread Looper. Pour ce faire, tout ce que vous devez faire est d'ajouter les lignes suivantes dans la fonction run() de votre thread.

Looper.prepare();

Looper.loop();