Entendiendo el hilo de la interfaz de usuario

Soy un principiante de Android y tengo algunas confusiones sobre Android UI Thread . Ahora, sé que ningún hilo aparte del que creó la interfaz de usuario puede modificarlo.

Estupendo.
Aquí está la Activity de mi primera aplicación de Android que me confunde un poco.

 public class NasaDailyImage extends Activity{ public ProgressDialog modalDialog = null; //------------------------------------------------------------------------------ @Override protected void onCreate(Bundle savedInstanceState){ //Instantiate progress dialog, skipping details. Button b = //get reference to button b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { modalDialog.show(); // show modal Toast.makeText(getApplicationContext(), "Getting feeds", 500).show(); new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !! } }); } //------------------------------------------------------------------------------ public synchronized void resetDisplay(boolean parseErrorOccured, boolean imageErrorOccured, IotdHandler newFeeds){ if(parseErrorOccured || imageErrorOccured){ // make a Toast // do not update display }else{ // make a Toast // update display // based on new feed } } //------------------------------------------------------------------------------ class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{ @Override protected IotdHandler doInBackground(IotdHandler... arg0) { IotdHandler handler = arg0[0]; handler.processFeed(); // get the RSS feed data ! return handler; } //------------------------------------------------------------------------------ @Override protected void onPostExecute(IotdHandler fromInBackground){ resetDisplay( // call to update the display fromInBackground.errorOccured, fromInBackground.imageError, fromInBackground); } //------------------------------------------------------------------------------ } 

1. onCreate está en el hilo de IU para poder hacer lo que quiera, pero onClick no lo es. ¿Por qué puedo hacer un ProgressDialog y un Toast en ese método? ¿Por qué no hay error?
2. El AsyncTask es subclase de la NasaDailyImage . Esto significa que puede acceder a todos los métodos de NasaDailyImage incluyendo resetDisplay() que actualiza la pantalla. resetDisplay() se llama en el onPostExecute que se ejecuta en un hilo diferente de la interfaz de usuario. Entonces, ¿por qué puedo actualizar la pantalla allí y sin embargo no recibir errores?

  1. onClick() está realmente en el hilo de interfaz de usuario. La mayor parte de lo que sucede en una actividad ocurre en el hilo de la interfaz de usuario.

  2. onPostExecte() (y su contraparte onPreExecute() ) se ejecuta en el subproceso de interfaz de usuario también. La documentación AsyncTask.onPostExecte() lo indica claramente. AsyncTask fue diseñado deliberadamente para que los desarrolladores pudieran actualizar la interfaz de usuario antes y después de realizar el trabajo de fondo.

En general, el código se ejecutará en el subproceso de la interfaz de usuario, a menos que se indique explícitamente lo contrario. Una vez que cree AsyncTasks, Runnables o Threads, debe asegurarse de que entiende dónde está ejecutando su código. En una actividad, normalmente es seguro asumir que está en el subproceso de la interfaz de usuario.

  1. Está extendiendo la clase AsyncTask, donde la clase de tarea asíncrona está llamando su método secuencial automáticamente. Primero onPreExecute entonces doBackground y finalmente onPost . Si desea cambiar cualquier cambio ui, puede utilizar el método onProgressUpdate .

  2. Para usar su clase de actividad simple, llame a activityclass.this.resetDisplay() . Debido a que el alcance de la clase interna a veces falló en integrar excepto global varible.

Gracias

  • Android Async tarea cancel / stop
  • ¿Cómo ejecutar AsyncTask <> localizado en un fragmento de su padre?
  • ¿Es posible separar la interfaz de usuario de WebView y los subprocesos HTTP?
  • Descargar archivos grandes (> 100mb) en Honeycomb en AsyncTask ralentiza la interfaz de usuario, posiblemente debido a GC?
  • Cargar anuncio (adMob) en el subproceso de fondo
  • Android: no se puede resolver el método 'findViewById (int)' en AsyncTask
  • Actualizar TextView desde Async Tarea que utiliza el diálogo de programa personalizado
  • Android: descarga el archivo desde el servidor y muestra el progreso de la descarga en la barra de notificación mediante AsyncTask
  • Cómo dejar que Async Task termine en Android
  • AsyncTask clase externa con ProgressDialog
  • Conexión a un servicio web desde android - AsyncTask o Service?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.