Comment Obtenir De L'Emplacement À L'Aide D'AsyncTask
Je suis en tirant mes cheveux à essayer de trouver une bonne solution à ce problème. J'ai fait mon application afin qu'il trouve ma position. Il semble trop compliqué mais assez facile. Mais à l'issue d'googles recommandations je suis maintenant en train d'exécuter ce code comme une tâche Asynchrone afin de ne pas attacher de l'INTERFACE utilisateur. Cependant, je ne peux même pas comprendre comment obtenir le code pour compiler jamais l'esprit le fait exécuter. L'erreur est que locationManager ne peut pas être résolu quand j'référence pour enlever les auditeurs. J'ai essayé d'utiliser le code posté ici Android trouver de localisation GPS une fois, montrer dialogue de chargement. Toutefois, dans cet exemple currentLocation n'a pas semblé être référencé à rien et j'ai couru dans des problèmes en essayant d'ignorer cela. J'ai perdu presque une journée entière à essayer de régler ce problème donc je serais vraiment reconnaissant si quelqu'un peut me pointer dans la bonne direction.
private class LocationControl extends AsyncTask<Context, Void, Location> {
public Location alocation;
private LocatoinManager locationManager;
@Override
public Location doInBackground(Context... params) {
locationManager = (LocationManager) params[0].getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener);
return alocation;
}
public LocationListener locationListener = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
public void onLocationChanged(android.location.Location mlocation) {
saveLocation(mlocation);
locationManager.removeUpdates(locationListener);
}
};
void saveLocation(android.location.Location location){
alocation = location;
}
@Override
protected void onPostExecute(Location result) {
useLocation(result);
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
dialog.show(WasserSportLotse.this, " ", "Finding location...");
super.onPreExecute();
}
}
J'ai donc modifié le code de vos recommandations et à présent, il compile. J'ai mis à jour le code sur ici pour représenter ce que je suis en cours d'exécution. J'obtiens une erreur d'exécution lors de la locationManager requestsLocationUpdates. Voici le logCat. Des Idées?
04-15 14:57:56.742: ERROR/AndroidRuntime(18328): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.lang.Thread.run(Thread.java:1060)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.Handler.<init>(Handler.java:121)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): ... 4 more
04-15 14:58:23.451: ERROR/AndroidRuntime(18356): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.lang.Thread.run(Thread.java:1060)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.Handler.<init>(Handler.java:121)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): ... 4 more
OriginalL'auteur jiduvah | 2011-04-15
Vous devez vous connecter pour publier un commentaire.
+1. C'est un excellent exemple qui évite les Loopers, qui peut être source de confusion.
Ce code ne s'exécute pas l'emplacement du gestionnaire dans le fond, mais dans la onPreExecute() méthode qui s'exécute dans le thread de l'INTERFACE utilisateur.
D'accord, il la remplace par une simple boucle,
while (this.lati == 0.0) {}
.u peut expliquer qu'est-ce que l'utilisation de asyn tâche lorsque doInBackground() méthode de boucle(attendre) à ne rien faire... et de la charge de travail dans le thread de l'Interface utilisateur
OriginalL'auteur SALMAN
Juste ajouter
Looper.prepare()
avant d'appelerlocationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener);
N'oubliez pas d'appeler la fonction Looper.loop() après.
mais si je veux arrêter cette boucle?
OriginalL'auteur jibysthomas
Première pour réparer votre problème de compilation,
déplacer
De sorte que c'est une variable membre privée de la classe.
LocationManager n'a pas à être dans une AsyncTask. Il ne monopolise pas l'INTERFACE utilisateur, toutes les mises à jour sont déjà asynchrone. Ce sera juste ajouter des complications inutiles à votre projet.
Vous aurez probablement besoin de se déplacer useLocation en onLockationChanged.
Je suggère de se débarrasser de l'AsyncTask. L'erreur d'exécution pourrait tout simplement disparaître.
C'est comment j'ai d'abord eu l'app de travail toutefois, j'ai un écran de démarrage et je voudrais afficher une boîte de dialogue lorsque je suis arriver sur le lieu. La boîte de dialogue a été le gel lors de cette opération. d'où la nécessité pour le asyntask.
Avez-vous une référence qui explique comment
LocationManager
fonctionne de manière asynchrone? Il n'y a rien à propos de ça que j'ai pu trouver sur la page de référence.OriginalL'auteur Mike dg
OriginalL'auteur Yasar Khan