thread handlerthread example asynctask async android android-asynctask looper

handlerthread - runnable android



Errores AsyncTask y Looper.prepare() (2)

Intenté esto ... Funcionó, espero que te ayude ...

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; } }

Tengo el siguiente código

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; } }

Parece que funciona bien en algunos dispositivos de prueba, pero veo muchos errores que aparecen en la consola de desarrollo. Parece que no puedo averiguar por qué y dónde colocar este Looper.prepare (). ¿Es necesario?

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)

Según lo solicitado 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); } }


Larga historia:

AsyncTask usa internamente un AsyncTask . Un controlador básicamente le permite publicar Runnables de otro hilo en el hilo al que se le asignó el controlador, que en el caso de AsyncTask es siempre el hilo desde el que se llama. Sin embargo, esto solo funciona para hilos que tienen un Looper preparado.

Para obtener más información, consulte http://developer.android.com/reference/android/os/Handler.html

Cuento:

Simplemente FinderMain$1.gotLocation cada llamada a FinderMain$1.gotLocation o la creación de AsyncTask dentro de ella en Runnable , y Runnable en un Handler vinculado al hilo de UI, así:

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); } }); // ... } }