handlerthread example asynctask android multithreading android-asynctask looper

example - asynctask android



Solo se puede crear un Looper por cada thread Error, Async Task (1)

Looper no tiene nada que ver con los bucles. The Looper es la parte del sistema Android que controla el hilo de UI. Hay varias cosas que no funcionarán sin preparar el looper, pero en general es mejor evitar Looper.prepare (); a menos que sea absolutamente necesario. Es mucho mejor utilizar el doInBackground asincrónico para realizar el procesamiento de datos u otras operaciones más largas, y luego actualizar la UI con onPostExecute y onProgressUpdate.

En resumen, a menos que esté usando la UI de alguna manera, no necesita llamar al Looper. Si tiene que llamar al Looper, probablemente necesite reestructurar el funcionamiento de los hilos de fondo.

El código en la parte inferior de esta publicación se desencadena por la siguiente línea de código.

new MasterClickAsyncTask(main).execute(position);

La parte doInBackground del código siguiente llama a un método que contiene un bucle for, de ahí la necesidad de Looper.prepare ().

Este código funciona bien las primeras veces que se llama pero arroja el siguiente error:

10-15 22: 50: 24.752: ERROR / AndroidRuntime (9258): Causado por: java.lang.RuntimeException: solo se puede crear un Looper por subproceso

Intenté poner Looper.getMainLooper (). Quit (); y algunas otras cosas como esta en varias partes de AsyncTask pero esto solo ha hecho que se cuelgue inmediatamente.

¿Alguna ayuda?

Código:

import java.io.IOException; import java.net.MalformedURLException; import org.json.JSONException; import android.os.AsyncTask; import android.os.Looper; import android.view.View; public class MasterClickAsyncTask extends AsyncTask<Integer, Void, Void> { Master selectedMaster; Main main; MasterGridView masterGridView; Integer i; DiscogProxy discogProxy = new DiscogProxy(); MasterClickAsyncTask(Main main){ this.main = main; this.masterGridView = main.getMasterGridView(); } @Override protected void onPreExecute() { main.progressBar.setVisibility(View.VISIBLE); } @Override protected Void doInBackground(Integer... params) { masterGridView.getSelectedView(); Globals.selectedMaster = (Master)(masterGridView).getItemAtPosition(params[0].intValue()); Globals.selectedMaster.getVersionListView().getVersionList().clear(); Looper.prepare(); try { Globals.selectedMaster.getVersionListView().populateVersionList(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //Looper.getMainLooper().quit(); return null; } @Override protected void onPostExecute(Void result) { main.populateAlbumVersionsView(); main.progressBar.setVisibility(View.GONE); } }