studio peticiones oncancelled manejo implement hilos definicion asynctask asincronos asincronas android multithreading android-asynctask android-context

android - peticiones - Por qué el contexto no se puede usar en doInBackground() de AsyncTask



oncancelled asynctask android (3)

Solo estoy descubriendo cuál es el hecho detrás de no usar Contexto dentro de doInBackground() . De hecho, no podemos actualizar la interfaz de usuario dentro de doInBackground () directamente, para actualizar la interfaz de usuario dentro de DoInBackground () tenemos que llamar a otra publishProgress() mediante el método publishProgress() que es responsable de llamar a onProgressUpdate() .
En resumen, solo quería saber cuál es la química entre el UI thread y AsyncTask , y por qué AsyncTask se ejecuta en UI Thread.


AsyncTask permite el uso adecuado y fácil del subproceso de interfaz de usuario. Esta clase permite realizar operaciones en segundo plano y publicar resultados en el subproceso de la interfaz de usuario sin tener que manipular subprocesos y / o controladores.

AsyncTask está diseñado para ser una clase auxiliar alrededor de Thread and Handler y no constituye un marco de threading genérico. AsyncTasks debería utilizarse idealmente para operaciones cortas (unos segundos como máximo). Si necesita mantener los hilos en ejecución durante largos periodos de tiempo, se recomienda encarecidamente que utilice las diversas API proporcionadas por el paquete java.util.concurrent, como Ejecutor, ThreadPoolExecutor y FutureTask.

Una tarea asíncrona se define mediante un cálculo que se ejecuta en un subproceso en segundo plano y cuyo resultado se publica en el subproceso de la interfaz de usuario. Una tarea asincrónica está definida por 3 tipos genéricos, llamados Params, Progress y Result, y 4 pasos, llamados onPreExecute, doInBackground, onProgressUpdate y onPostExecute.

Para obtener más información sobre el uso de tareas y subprocesos, lea la guía para desarrolladores de Procesos e hilos .


P ¿Por qué el contexto no se puede usar en doInBackground () de AsyncTask?

Contexto como su nombre lo sugiere, es el contexto del estado actual de la aplicación / objeto. Permite que los objetos recién creados comprendan lo que ha estado sucediendo. Normalmente lo llamas para obtener información sobre otra parte de tu programa (actividad, paquete / aplicación)

Donde doInBackground () no tiene relación / (contexto) o no está relacionado con la Actividad presente cuando está en doInBackground() . No tienes acceso al hilo principal. Se trata de una actividad completamente nueva que realizará su tarea incluso si su Thread / Activity principal ha dejado de funcionar.

AsyncTask no se ejecuta en el subproceso principal o en el subproceso principal de UI al que solía llamarlo. Se ejecuta en un subproceso independiente para realizar la tarea que se le asignó.

Para poder hacer cambios en la UI después de que se complete el AsycTask, debe llamar

protected void onPostExecute(String string) { Toast c=Toast.makeText(getApplicationContext(), string, Toast.LENGTH_LONG); c.show(); }

Todos los cambios de UI se pueden realizar en el vacío protegido onPostExecute ()

En resumen doInBackground() No puede hacer ningún cambio en su subproceso principal y no depende de su UI / subproceso principal, por lo que no se trata de utilizar el contexto en doInBackground()

P ¿Por qué podemos usar el contexto en onPreExecute () y onPostExecute ()?

Un AsycTask tiene

1. onPreExecute() Pre / Before crear un nuevo Thread (puede hacer cambios al hilo principal)

onPreExecute () tiene contexto para el hilo principal / AsycTask Still en el hilo principal

2. doInBackground() ha creado un nuevo hilo propio para realizar la tarea indicada. Una vez en este estado / hilo, no puedes hacer nada hasta que esté completo.

doInBackground () Sin contexto. El hilo nuevo se crea por sí mismo. Una vez creado el nuevo hilo, completará su tarea determinada, independientemente del hilo principal que se mate / Detenga. / AsycTask en hilo nuevo.

3. onPostExecute() - Después de que doInBackground () complete su tarea onPostExecute () se llame Para que los resultados del cálculo puedan ser utilizados por el hilo principal

onPostExecute () tiene contexto para el hilo principal / AsycTask en el hilo principal.


Podemos usar el contexto en el método doinbackground pero solo para obtener valor del componente ui. No podemos usar el contexto para establecer el valor en el componente ui