AsyncTask y WeakReference Research en Android 💫 | Por Durbanshu Datta | Backyard Programmer | Febrero de 2022


AsyncTask está en desuso, no lo usará muy a menudo en estos días, los encontrará en proyectos heredados. Pero cuando comencé a desarrollar Android, era la forma definitiva de realizar tareas y procesamientos en segundo plano.
AsyncTask hace que sea más fácil trabajar en un subproceso en segundo plano y publicar cambios en el subproceso de la interfaz de usuario, ya que no deberíamos realizar tareas pesadas en el subproceso de la interfaz de usuario, ya que bloquearía la interfaz de usuario y haría que nuestra aplicación no responda. Entonces, deberíamos hacer estas tareas pesadas en el subproceso en segundo plano, pero el problema es que no podemos acceder a nuestra vista en el subproceso en segundo plano. AsyncTask es para facilitar esta tarea, está diseñado para operaciones cortas que toman unos segundos como máximo.
Hicimos una interfaz de usuario simple botón con uno barra de progreso horizontal, Solo una interfaz de usuario simple que inicialmente marca ProgressBar como invisible, luego muestra el progreso y finalmente desaparece.
Primero, creemos una clase interna privada, llamémosla tarea asíncrona virtual y ampliar tarea asincrónica(sí, está en desuso). AsyncTask acepta tres parámetros que queremos pasar a AsyncTask y luego usarlos para operar con ellos.
- parámetro: Este parámetro utilizado en AsyncTask puede ser de cualquier tipo genérico, como URL. Aquí tomamos un número entero como la duración del progreso.
- Progreso: Cuando nuestra AsyncTask nos da la posibilidad de publicar el progreso en ruta. Aquí, tomamos números enteros porque publicamos el progreso como un número.
- resultado: Este es el resultado que esperamos de AsyncTask, como un mapa de bits de una imagen. Aquí, regresaremos como una cadena para indicar que hemos terminado.

Tenemos que implementar un método de coerción, es decir, doInBackground() Otros son opcionales.esto es en hilo de fondo, aquí es donde tienes que hacer el trabajo pesado.Puedes ver que el tipo de retorno es el que tenemos en resultado durante la declaración.
También anularemos algunos métodos opcionales, onPreExecute() , onProgressUpdate() y onPostExecute() Estas funciones se ejecutan en Subproceso de interfaz de usuario
- Antes de que comience nuestro trabajo en segundo plano, hacemos ProgressBar en
onPreExecute()Haga la configuración inicial aquí. - en el interior
doInBackground()método, puede ver el tipo de parámetro parámetro variable Esto significa que puede pasar cualquier número de parámetros. Vamos a hacer un trabajo falso aquí.EstapublishProgress()permitirnos activaronProgressUpdate()Y pasar tantos elementos como queramos. onProgressUpdate()cuando se activapublishProgress()llamado. Haremos una actualización de la interfaz de usuario para el progreso aquí.onPostExecute()La devolución de llamada se activa cuando obtenemos el resultado final.doInBackground()Obtenemos este resultado y lo usamos en consecuencia.
Finalmente, para iniciar esta AsyncTask, crearemos una instancia de este tarea asíncrona virtual y llama execute()método

Esta tarea asíncrona virtual Las clases internas pueden tener referencias implícitas a las clases externas, es decir, podemos usar ProgressBar onPreExecute() Porque hacemos referencia a nuestra actividad principal. El problema cuando se destruye la Actividad o giramos el dispositivo en el caso normal se eliminará de la memoria, pero aquí DummyAsyncTask puede durar más que nuestra MainActivity y, dado que tenemos una referencia a la actividad principal, no se puede recolectar basura, por lo que no puede usar MainActivity pero aún permanece en la memoria.Se llama Pérdida de memoria.
Companion Object se usa donde podemos almacenar referencias débiles a Activity. Es equivalente a una clase estática. Entonces AsyncTasks se definen en un objeto complementario.

Esta
WeakReferencepermitirActivityse recolecta basura, por lo que no tiene pérdidas de memoria. Si se destruye la WeakReference activa, aún se puede recolectar basura.Entonces es seguro guardarlo en AsyncTask
Primero, agregaremos toda la clase interna dentro companion object.En segundo lugar, pasaremos la Actividad a través del constructor.En tercer lugar, haremos un ejemplo. referencia débil e inicializarlo con actividad.
Usaremos esta referencia débil en métodos de interfaz de usuario onPreExecute() , onProgressUpdate() y onPostExecute() En esta función crearemos una instancia de la actividad activityReference.get() Esto nos da una fuerte referencia a nuestras actividades. Entonces te preguntarás por qué esta fuerte referencia provoca una pérdida de memoria. La diferencia es que solo tenemos referencias dentro del método, por lo que cuando finaliza este método, nuestras referencias están listas para la recolección de elementos no utilizados.Si su MainActivity ha sido destruida activityReference.get() devolverá nulo, en este caso, devolveremos directamente. Use lo mismo para otras características de la interfaz de usuario.
De esta manera tenemos WeakReference en clase y StrongReference en método.

¡Guau! ¡lo hiciste! 🚀

AsyncTask no es en absoluto la forma recomendada de realizar llamadas asincrónicas en Android, tenemos corrutinas, todas las cuales son muy fáciles y no tienen problemas de pérdida de memoria. Esto es solo para comprender el propósito y los beneficios de las referencias débiles con múltiples aplicaciones.
Si tiene alguna pregunta y sugerencia, puede ponerse en contacto con mi Instagram, LinkedInSígueme para contenido de Kotlin y más. ¡Feliz codificación!
Agradecería uno de estos 👏








