2010-01-28 4 views
3

J'ai des problèmes concernant un LocationListener dans mon service appelé myService.Pourquoi mon emplacement LocationListener devient-il nul?

Voici mon code:

///onStart method .. 
onStart() { 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE) 
    . 
    . 
    provider = locationManager.getBestProvider(criteria, true); 
    locationListener = (LocationListener) new MyLocationListener(); 
    locationManager.requestLocationUpdates(provider, 0, 0, locationListener); 
} 

Dans mon activité il y a un bouton qui devrait arrêter le service. Sur le clic du bouton que je fais:

stopService(new Intent(getApplicationContext(), myService.class) 

Dans le fichier myService.java je:

////onDestroy method.... 
onDestroy() { 
    locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.removeUpdates(locationListener); //Getting **exception here .... 
} 

je reçois l'exception suivante:

java.lang.IllegalArgumentException: listener==null at android.location.LocationManager.removeUpdates(LocationManager.java:799) at 
<.package_name>myService.onDestroy(myService.java:407) 

Je ne sais pas pourquoi l'écouteur retourne null sans raison. S'il vous plaît pouvez-vous me dire où je me trompe!

+0

Est-ce que vous le réglez manuellement à nulle part ailleurs dans le code? – JRL

+0

Je suis sûr que je ne le mets pas à zéro. Je pense que le service est redémarré, mais je ne comprends pas quelle partie du code il est exécuté quand le service redémarre. – sheik

Répondre

0

Je pourrais être ici, mais il semble que votre service soit peut-être tué puis redémarré (plus tard). Pourquoi ne pas déplacer les choses d'instanciation dans onCreate()?

+0

merci pour les ans. Pouvez-vous s'il vous plaît expliquer quelles peuvent être les raisons/causes pour le service de redémarrer. – sheik

1

Le système Android force l'arrêt d'un service uniquement lorsque la mémoire est faible et qu'il doit récupérer les ressources système pour l'activité qui a le focus sur l'utilisateur. Si le service est lié à une activité qui a le focus de l'utilisateur, alors il est moins susceptible d'être tué, et si le service est déclaré s'exécuter au premier plan (discuté plus tard), il ne sera presque jamais tué. Sinon, si le service a été démarré et fonctionne depuis longtemps, le système réduira sa position dans la liste des tâches en arrière-plan et le service deviendra très vulnérable à la mise à mort. Si votre service est démarré, vous devez le concevoir gérer gracieusement les redémarrages par le système. Si le système détruit votre service, il le redémarre dès que les ressources redeviennent disponibles (bien que cela dépende aussi de la valeur que vous renvoyez de onStartCommand(), comme indiqué plus loin). Pour plus d'informations sur le moment où le système peut détruire un service, consultez le document Processus et threads.

Questions connexes