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.
- ¿Cómo obtengo las preferencias compartidas en Asynctask?
- Java.lang.NullPointerException: Intenta invocar el método virtual 'android.view.View .MainActivity.findViewById (int)' en una referencia de objeto nulo
- Android: pasa la referencia de función a AsyncTask
- Tostada en AsyncTask en la clase Non Activity
- Android AsyncTask ejemplo y explicación
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?
- ¿Cómo realizar cambios en la interfaz de usuario de una Android AsyncTask?
- Uso de AsyncTask
- Conseguir un no puede hacer una redfrence estática a una no estática methed cuando llamo AsyncTask <Void.exicute
- ¿Hay una manera de detener la ejecución de un HttpClient en un AsyncTask?
- Comparación de rendimiento: AsyncTasks vs Threads
- AsyncTask onPostExecute no se ejecuta en el hilo principal?
- AsyncTask "Sólo el subproceso original que creó una jerarquía de vista puede tocar sus vistas."
- Cómo pasar en dos tipos de datos diferentes a AsyncTask, Android
-
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. -
onPostExecte()
(y su contraparteonPreExecute()
) se ejecuta en el subproceso de interfaz de usuario también. La documentaciónAsyncTask.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.
-
Está extendiendo la clase AsyncTask, donde la clase de tarea asíncrona está llamando su método secuencial automáticamente. Primero
onPreExecute
entoncesdoBackground
y finalmenteonPost
. Si desea cambiar cualquier cambio ui, puede utilizar el métodoonProgressUpdate
. -
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
- Mantenga los archivos 'META-INF / services' en apk
- ¿Cuál es la forma correcta de utilizar el método android.text.format.DateFormat.format