Android: Minuterie dans un Service d'arrière-plan
Salutations,
Je suis en train de mettre en œuvre une minuterie qui envoie les coordonnées GPS de mon serveur toutes les 10 secondes.
Voici l'extrait de code dans le Service, je suis la mise en œuvre:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Timer timer=new Timer();
TimerTask tt=new TimerTask(){
@Override
public void run() {
Location loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
sendCoords(String.valueOf(loc.getLatitude()), String.valueOf(loc.getLongitude()));
Toast.LENGTH_SHORT).show();
Log.i("EOH",String.valueOf(loc.getLatitude()));
}
};
timer.schedule(tt,0,10000);
return START_STICKY;
}
Maintenant, le problème est que quoi que ce soit à l'intérieur de run() provoque mon app fermée de force.
Voici le LogCat dump:
12-28 18:44:18.284:
ERREUR/AndroidRuntime(6537): FATAL
EXCEPTION: Minuterie-0 12-28 18:44:18.284:
ERREUR/AndroidRuntime(6537):
java.lang.RuntimeException: ne Peut pas
gestionnaire de créer à l'intérieur de thread qui a
pas appelé Looper.préparer() 12-28
18:44:18.284:
ERREUR/AndroidRuntime(6537): à
android.os.Gestionnaire d'.(Handler.java:121)
12-28 18:44:18.284:
ERREUR/AndroidRuntime(6537): à
prestocab.le pilote.Arrière-plan$2.(En arrière-plan.java:83)
12-28 18:44:18.284:
ERREUR/AndroidRuntime(6537): à
prestocab.le pilote.Arrière-plan.sendCoords(arrière-plan.java:83)
12-28 18:44:18.284:
ERREUR/AndroidRuntime(6537): à
prestocab.le pilote.Arrière-plan$3.exécuter(en arrière-plan.java:114)
12-28 18:44:18.284:
ERREUR/AndroidRuntime(6537): à
java.util.Minuterie$TimerImpl.exécuter(Minuterie.java:289)
12-28 18:44:18.554:
ERREUR/WindowManager(1310): de retour dans
removeWindowLocked
Quelqu'un peut-il suggérer une solution pour cela?
J'ai essayé d'utiliser le locationManager onLocationChanged() de la fonction, mais je ne peux pas définir l'intervalle de 10 secondes. Apparemment, le temps spécifié est seulement un guide et le système d'exploitation détermine ce qui est le meilleur. Même quand j'ai mis l'intervalle de 100 secondes, il me donne l'emplacement de chaque seconde. C'est la raison pour moi, à l'aide d'une minuterie.
J'espère que quelqu'un peut suggérer quelque chose.
Merci d'avance,
Apparemment, à partir de ce post, stackoverflow.com/questions/4418018/... les paramètres sont seulement des indicateurs et pour chaque périphérique décide ce qui est le mieux...
OriginalL'auteur Eamorr | 2010-12-28
Vous devez vous connecter pour publier un commentaire.
Qui est irréaliste. Vous ne pouvez pas obtenir les correctifs à tous. Vous ne pouvez pas obtenir les correctifs jusqu'à bien au-delà de 10 secondes. Par exemple, je suis en train de tester un service conçu pour aider les développeurs de sondage pour l'emplacement des mises à jour sur une fréquence beaucoup plus faible (p. ex., une fois par heure), et il peut facilement prendre plus d'une minute pour obtenir une solution, même à partir d'un téléphone assis à une fenêtre.
Qui est imparfait.
getLastKnownLocation()
retournent en généralnull
, pour commencer, au-delà de votreTimer
/TimerTask
question.Je voudrais commencer par la refonte de votre application pour se débarrasser de l'10 deuxième concept comme un dur exigence.
Ensuite, utilisez
requestLocationUpdates()
. Si vous obtenez trop de lectures, d'ignorer ceux que vous ne voulez pas et de ne pas les envoyer au serveur. Et, bien sûr, il suffit d'exécuter ce pour une courte période de temps et uniquement basée sur une demande de l'utilisateur (par exemple, l'exécution de votre application explicitement), compte tenu de la consommation de la batterie impliqués dans le maintien de la radio GPS sur.La documentation pour
requestLocationUpdates()
est certainement source de confusion dans le calendrier de l'avant -- j'ai récemment réalisé que le temps minimum n'est pas nécessairement à l'honneur.poliment en désaccord. si l'utilisateur d'origine a décidé qu'il n'a pas besoin d'un événement chronométré, l'application, la question n'est pas en soi inutile. disons que vous avez besoin de savoir où l'utilisateur est toutes les XX secondes (je suis d'accord que 10 peut-être exagérée). vous pourriez ne pas avoir une position gps SI vous avez besoin de démarrer à la recherche d'emplacement toutes les 10 secondes, mais vous devriez avoir lieu en cache avant de l'appeler. s'il vous plaît vérifier Reto Meier Plongée Profonde dans l'Emplacement. retoMeier connaît son affaire, il est Tech responsable chez Google.
OriginalL'auteur CommonsWare
J'ai remarqué dans la trace de la pile de la déclaration au sujet de "ne Peut pas créer de gestionnaire à l'intérieur de thread qui n'a pas appelé Looper.préparer() ......." ce qui me rappelle d'une croix type de filetage erreur ou une situation où un objet n'a pas fini de configurer son état interne. encore.
J'ai vu une vidéo d'un couple de semaines, en vertu de laquelle le présentateur était en train de faire quelque chose de similaire ... envoi dans les données du GPS basé sur une Minuterie, mais je n'arrive pas à le trouver dès maintenant. Essayez de faire une recherche sur ce que ... il était environ une heure de vidéo, mais vaut le temps.
OriginalL'auteur BonanzaDriver
Que vous appelez le Principal élément de l'INTERFACE utilisateur avec le filetage extérieur de sorte que le MainUI thread à l'exception de l'utilisation de cette tout en invoquant les Toasts ou à tout autre composant de l'INTERFACE utilisateur :-
Faire le Gestionnaire comme ceci :-
Maintenant faire de votre thread comme celui-ci :-
Espère que cela va vous aider.
OriginalL'auteur jitain sharma