¿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

 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.

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.

  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
  • IU de Android: ¿cuándo puedo modificar directamente una vista?
  • ¿Por qué sólo el subproceso de interfaz de usuario en Android puede actualizar la interfaz de usuario?
  • ¿Es apropiado SQL o acceso general a archivos en el hilo principal de la interfaz de usuario de Android?
  • Diferencia entre Handler.post (Runnable r) y Activity.runOnUiThread (Runnable r)
  • Android - llamando al hilo de ui del hilo de trabajo
  • No se muestra la vista de Android después del método addView
  • Cómo utilizar runOnUiThread
  • Android - SQLite ContentResolver insertar / eliminar / actualizar en UI Thread?
  • ¿Por qué se utiliza un único modelo de subproceso para actualizar la interfaz de usuario como subproceso principal?
  • Servicio de Android e hilo de la interfaz de usuario
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.