2011-10-15 4 views
2

J'ai un thread qui tente d'obtenir l'emplacement de l'utilisateur. Lorsque l'emplacement est reçu, "handler.sendMessage (msg)" est appelé et renvoie true, mais handleMessage n'est jamais appelé.handleMessage non appelé

Il n'y a pas d'erreur ou d'avertissement dans logcat.

Le code:

public class LocationThread extends Thread implements LocationListener { 
    // ... Other (non-relevant) methods 

    @Override 
    public void run() { 
     super.run(); 

     Looper.prepare(); 
     mainHandler = new Handler(Looper.myLooper()) { 
      @Override 
      public void handleMessage(Message msg) { 
       // This method is never called 
      } 
     }; 
     locationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, 0, 0, this); 
     Looper.loop(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // SendMessage is executed and returns true 
     mainHandler.sendMessage(msg); 
     if (mainHandler != null) { 
      mainHandler.getLooper().quit(); 
     } 
     locationManager.removeUpdates(this); 
    } 
} 
+0

vous l'avez écrit chèque OnLocation changé dans l'appareil ... –

+0

Est-ce que vous essayez d'avoir la méthode handleMessage quitter la boucle? – Fildor

+0

J'ai juste essayé, mais ça n'a pas fait de différence. –

Répondre

3

Très probablement ce qui se passe parce que vous appelez Looper.quit() immédiatement après avoir affiché le message au Handler. Cela termine effectivement l'opération de file d'attente de messages avant que le Handler ait une chance de le traiter. Envoyer un message au Handler le poste simplement dans la file d'attente des messages. Le gestionnaire récupérera le message lors de la prochaine itération du Looper. Si votre objectif est de terminer le thread après la réception d'une mise à jour d'emplacement, il est préférable d'appeler Looper.quit() depuis l'intérieur de handleMessage().

Editorial

De plus, si le seul but de se lever ce fil est d'attendre la mise à jour d'emplacement pour entrer, il est inutile. LocationManager.requestLocationUpdates() est un processus intrinsèquement asynchrone (votre thread principal n'est pas bloqué lorsque le correctif d'emplacement est obtenu). Vous pouvez directement mettre en œuvre votre activité/service LocationListener directement et recevoir la valeur d'emplacement.

HTH

+0

La première solution n'a pas fonctionné pour moi, peut-être parce que je courais un fil dans un fil. Néanmoins, la deuxième solution (qui est de toute façon meilleure) a fonctionné pour moi. J'ai supprimé tous les éléments liés aux threads et j'ai simplement appelé le runnable dans la méthode: "onLocationChanged". –