¿OnPreExecute () y onPostExecute () se ejecutan en el subproceso de interfaz de usuario o en el subproceso desde el que se inició AsyncTask?
He estado escribiendo AsyncTask
para operaciones cortas de fondo en android desde hace bastante tiempo y tenía una pregunta muy básica. Si comienzo un AsyncTask
de un hilo separado y no el subproceso principal de UI, mis onPreExecute()
y onPostExecute
siendo llamados en el subproceso UI o el subproceso del cual inicié AsyncTask
. Tengo curiosidad porque no pude mostrar un popup dentro del método onPreExecute()
cuando lo inicié desde algún otro hilo.
EDIT 2
- Manejar, quiero correr periódicamente
- Configuración de TextView visible desde otro hilo o BeginInvoke en Android
- DoInBackground llama a AsyncTask entonces duerme bloques UI Thread
- No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () 3
- ¿Qué sucede con un AsyncTask cuando la actividad de lanzamiento se detiene / destruye mientras todavía se está ejecutando?
I tried writing this simple activity to try: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { final TestAsyncTask task = new TestAsyncTask(); task.execute(); } }).start(); } private class TestAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... voids) { return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); Toast.makeText(MainActivity.this, "Yo!", Toast.LENGTH_LONG).show(); } } }
Esto funciona muy bien. Pero cuando ejecuto la aplicación con el código siguiente:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { final TestAsyncTask task = new TestAsyncTask(); task.execute(); } }).start(); } private class TestAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(MainActivity.this, "Yo!", Toast.LENGTH_LONG).show(); } @Override protected Void doInBackground(Void... voids) { return null; } } }
Se produce un error con el siguiente error:
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Como una de las líneas en el seguimiento de la pila.
- Android, creando un hilo sencillo que actualizará mi contador de segundos
- ¿Es posible usar AsyncTask en una clase de servicio?
- No error "Sólo el subproceso original que creó una jerarquía de vista puede tocar sus vistas" cuando la vista se actualiza sin demora
- ¿Es una buena práctica crear AsyncTask anónima para paralelo pequeño proceso de congelación conocido?
- Cómo saber si este hilo es un hilo de interfaz de usuario
- Android ViewPager cambia automáticamente la página
- Admob: Cómo cargar AdRequest fuera de UI Thread?
- Animación de una vista mientras que ListView no está funcionando
Mientras que los documentos dicen que estas devoluciones de llamada se ejecutan en el hilo principal – no es cierto. onPreExecute()
ejecuta sincrónicamente desde el executeOnExecutor()
es decir, en el subproceso que inicia AsyncTask
.
onPostExecute()
siempre se ejecuta en el subproceso principal. (Se invoca desde finish()
, y esto sucede dentro de Handler
que usa looper de thread principal).
Debe hacer actualizaciones de la interfaz de usuario y alerta o aparece en el método onPostExecute () de AsyncTask que se ejecuta en el subproceso de interfaz de usuario. El método doinBackground () de AsyncTask se ejecuta en otro subproceso.
Citando documentos oficiales:
onPostExecute Added in API level 3 void onPostExecute (Result result) Runs on the UI thread after doInBackground(Params...). The specified result is the value returned by doInBackground(Params...). onPreExecute Added in API level 3 void onPreExecute () Runs on the UI thread before doInBackground(Params...).
Puede encontrarlo aquí https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)
Hacer en ejecución de fondo en el subproceso de fondo mientras OnPreExecute y OnPostExecute se ejecutan en el subproceso principal de Ui.
- Vista personalizada de Android ActionBarSherlock
- Jarsigner no es reconocido comando interno o externo