AsyncTask et Looper.prepare() erreur
J'ai le code suivant
class OverlayTask extends AsyncTask<Void, Void, Void> {
@Override
public void onPreExecute() {
if (sites != null) {
myMapView.getOverlays().remove(sites);
myMapView.invalidate();
sites = null;
}
}
@Override
public Void doInBackground(Void... unused) {
grabShipsWithLocation();
return (null);
}
@Override
public void onPostExecute(Void unused) {
myMapView.getOverlays().add(sites);
myMapView.invalidate();
isLoading = false;
}
}
Qui semble bien fonctionner sur quelques appareils d'essai, mais je vois beaucoup d'erreurs figurant sur le dev de la console. Je n'arrive pas à savoir pourquoi et où mettre ce Looper.prepare(). Est-il nécessaire?
java.lang.ExceptionInInitializerError
at com.test.appname.FinderMain$1.gotLocation(FinderMain.java:286)
at com.test.appname.MyLocation$GetLastLocation.run(MyLocation.java:89)
at java.util.Timer$TimerImpl.run(Timer.java:289)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
Comme demandé MyLocation.java
class GetLastLocation extends TimerTask {
@Override
public void run() {
lm.removeUpdates(locationListenerGps);
lm.removeUpdates(locationListenerNetwork);
Location net_loc=null, gps_loc=null;
if(gps_enabled)
gps_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if(network_enabled)
net_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//if there are both values use the latest one
if(gps_loc!=null && net_loc!=null){
if(gps_loc.getTime()>net_loc.getTime())
locationResult.gotLocation(gps_loc);
else
locationResult.gotLocation(net_loc);
return;
}
if(gps_loc!=null){
locationResult.gotLocation(gps_loc); //Line 89
return;
}
if(net_loc!=null){
locationResult.gotLocation(net_loc);
return;
}
locationResult.gotLocation(null);
}
}
- Ce n'grabShipsWithLocation() faire?
- Ce que la ligne est MyLocation.java:89? ajouter un commentaire à votre source.
- Êtes-vous de la création/démarrage de l'AsyncTask depuis le thread principal?
- Oui autant que je suis conscient.
- S'il vous plaît ajouter le
gotLocation()
méthode ou au moins le fragment de code qui initialise leOverlayTask
classe.
Vous devez vous connecter pour publier un commentaire.
Longue histoire:
AsyncTask
utilise en interne uneHandler
. Un gestionnaire permet essentiellement de postRunnables
partir d'un autre thread sur le fil le gestionnaire a été attribué, qui, dans le cas deAsyncTask
est toujours le fil à partir de laquelle il est appelé. Cela ne fonctionne que pour les threads qui ont unLooper
préparé, pourtant.Pour plus d'informations, voir http://developer.android.com/reference/android/os/Handler.html
Histoire courte:
Simplement envelopper chaque appel à
FinderMain$1.gotLocation
ou la création deAsyncTask
à l'intérieur dans unRunnable
, et de la poster sur unHandler
lié à la thread de l'INTERFACE utilisateur, comme ceci:J'ai essayé ce...Il a travaillé,j'espère qu'elle va vous aider..