0

Tout d'abord, je sais que LocationManager ne doit pas être appelé dans un AsyncTask comme il est déjà non bloquant l'interface utilisateur :)Android LocationManager dans AsyncTask

J'ai une activité qui 1. Obtient les utilisateurs emplacement actuel 2. Appelle un service Web pour récupérer une liste de points d'intérêt spécifiques autour de cet emplacement.

L'utilisateur peut choisir d'afficher les résultats sous forme de carte ou de liste à l'aide d'une TabActivity. En gardant cela à l'esprit, la tâche AsyncTask pour obtenir l'emplacement des utilisateurs et appeler Webservice est gérée par la vue TabActivity plutôt que par l'une des vues ancrées. Donc, je veux que le TabActivity démarre un AsyncTask qui obtient d'abord l'emplacement des utilisateurs, puis appelle le webservice. Une boîte de dialogue de progression empêche le basculement des vues à l'aide des onglets au cours de ce processus.

Tout fonctionne à peu près indépendamment de l'obtention de l'emplacement des utilisateurs à partir de l'AsyncTask. Le code du service web est écrit, le code de mappage et de superposition est écrit, la boîte de dialogue de progression de la tâche fait face aux changements d'orientation.

L'accent mis sur l'emplacement est la vitesse plutôt que la précision. Si l'utilisateur choisit d'afficher les résultats sur la carte, alors je fournirai un bouton «Ma position» qui permettra d'obtenir un emplacement plus précis. Je veux juste d'abord obtenir un emplacement approximatif et retourner les résultats de recherche rapidement. Peut-être que je vais à ce sujet dans le mauvais sens. Peut-être que je devrais afficher l'affichage de la carte, laisser l'activité de la carte trouver l'emplacement actuel, puis appeler seulement le webservice dans l'async - mais que se passe-t-il si l'utilisateur appuie sur l'onglet liste pendant la phase de localisation? J'allais également permettre à l'utilisateur de spécifier leur vue par défaut - certaines personnes peuvent préférer une liste à une carte. Dans ce cas, je voudrais avoir une liste qui devait récupérer l'emplacement.

Merci pour tout conseil Martin.

Répondre

0

Je l'ai analysé. Le problème que j'avais était que le LocationListener n'était pas appelé dans le AsyncTask. La raison de ceci était que bien que j'avais créé et préparé un lopper dans le fil que je n'avais pas appelé Looper.Loop()

Je lance le requestLocationUpdates, lance un temporisateur. Soit le gestionnaire de position répond avec un emplacement, soit le temporisateur expire. À ce stade, j'appelle looper.quit() pour s'assurer que les choses reviennent à la normale.

Cela semble fonctionner. Vous devez également vous rappeler de répondre au bouton précédent, etc., en annulant la minuterie et le boucleur si la tâche asynchrone est annulée.