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;
}
}
Cela semble bien fonctionner sur quelques appareils de test, mais je vois beaucoup d'erreurs apparaître sur la console de développement. Je n'arrive pas à comprendre pourquoi et où mettre ce Looper.prepare (). Est-ce 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);
}
}
Longue histoire:
AsyncTask
utilise en interne un Handler
. Un gestionnaire vous permet essentiellement de publier Runnables
à partir d'un autre thread sur le thread auquel le gestionnaire a été affecté, qui dans le cas de AsyncTask
est toujours le thread à partir duquel il est appelé. Cela ne fonctionne que pour les threads ayant un Looper
préparé.
Pour plus d'informations, voir http://developer.Android.com/reference/Android/os/Handler.html
Petite histoire:
Terminez simplement chaque appel à FinderMain$1.gotLocation
ou la création de AsyncTask
en son sein dans un Runnable
, et le publier dans un Handler
lié au thread d'interface utilisateur, comme ceci:
class GetLastLocation extends TimerTask {
private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void run() {
// ...
mHandler.post(new Runnable() {
public void run() {
locationResult.gotLocation(null);
}
});
// ...
}
}
J'ai essayé ça ... Ça a marché, j'espère que ça va vous aider ..
protected class Asyctast extends AsyncTask<String, Integer, Integer>
{
@Override
protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub
Log.d("Asynctask", ""+params);
Looper.prepare();
ImageThumbnailsActivity m = new ImageThumbnailsActivity();
Toast.makeText(ImageThumbnailsActivity.this,""+params ,Toast.LENGTH_SHORT).show();
final Dialog dialog_options = new Dialog(ImageThumbnailsActivity.this);
dialog_options.setContentView(R.layout.option);
dialog_options.show();
Looper.loop();
return null;
}
}