AsyncTaskLoader vs AsyncTask


129

Desde Honeycomby el v4 Compatibility Libraryes posible de usar AsyncTaskLoader. Por lo que entiendo, elAsyncTaskLoader puede sobrevivir a través de cambios de configuración como volteos de pantalla.

¿Se recomienda usar en AsyncTaskLoaderlugar de AsyncTask? ¿ LoaderManagerEntra en la imagen también?

Pero no he encontrado ningún buen ejemplo sobre cómo usar correctamente el AsyncTaskLoader. Los documentos tampoco proporcionan ejemplos. ¿Alguien puede dar algunos buenos ejemplos?

Respuestas:


51

Puede echar un vistazo al código fuente de la biblioteca de compatibilidad para obtener más información. Lo que FragmentActivityhace es:

  • mantener una lista de LoaderManager's
  • asegúrese de que no se destruyan cuando voltea su teléfono (u ocurre otro cambio de configuración) guardando instancias usando onRetainNonConfigurationInstance()
  • patear el cargador correcto cuando llame initLoader()a su actividad

Debe usar la LoaderManagerinterfaz con los cargadores y proporcionar las devoluciones de llamada necesarias para crear su (s) cargador (es) y llenar sus vistas con los datos que devuelven.

En general, debería ser más fácil que administrarlo AsyncTaskusted mismo. Sin embargo, AsyncTaskLoaderno está exactamente bien documentado, por lo que debe estudiar el ejemplo en los documentos y / o modelar su código después CursorLoader.


55
Voy a echar un vistazo a esto. Tal vez sea demasiado pronto para encontrar buenos ejemplos AsyncTaskLoader, y cuando más desarrolladores comiencen a usarlo, aparecerán más ejemplos.
OKA

47

Cuando compare AsyncTaskLoader versus AsyncTask , como sabrá cuando gire la pantalla de su dispositivo, puede destruir y volver a crear su actividad, para dejar en claro que la imagen gire su dispositivo mientras se realiza la transacción de red:

AsyncTask se volverá a ejecutar como subproceso de fondo nuevamente, y el procesamiento de subprocesos de fondo anterior era simplemente redundante y zombi.

AsyncTaskLoader solo se reutilizará basándose en la ID del cargador registrada anteriormente en el Administrador del cargador, así que evite volver a ejecutar la transacción de red.

En resumen, AsyncTaskLoader previene la duplicación de hilos de fondo y elimina la duplicación de actividades zombies.


11

AsyncTaskLoader realiza la misma función que AsyncTask , pero un poco mejor. Puede manejar los cambios de configuración de Actividad más fácilmente, y se comporta dentro de los ciclos de vida de Fragmentos y Actividades. Lo bueno es que AsyncTaskLoader se puede utilizar en cualquier situación en la que se esté utilizando AsyncTask. Cada vez que los datos deben cargarse en la memoria para que la Actividad / Fragmento los maneje, The AsyncTaskLoader puede hacer el trabajo mejor.

Sin embargo, hay algunos problemas con el uso de AsyncTasks:

  • Los cambios de configuración pueden estropear las cosas
  • Pausar una actividad no detiene la AsyncTask
  • Una buena cantidad de código repetitivo (lo que significa más errores posibles)

AsyncTaskLoader doc


8

Algunas diferencias distintas a las descritas en otras respuestas:

Cuando use AsyncTaskLoader sobre AsyncTask :

  • AsyncTaskLoader nos da la libertad de cargar datos en caché antiguos hasta que los nuevos datos sean devueltos porforceLoad()

  • Podemos establecer retrasos en AsyncTaskLoader por lo setUpdateThrottle()que puede evitar actualizaciones consecutivas al cliente (Actividad / Fragmento)

  • AsyncTaskLoader se puede compartir con varios fragmentos si tienen actividad principal común y si se inició desdegetActivity().getSupportLoaderManager()

  • AsyncTaskLoader se destruye LoaderMangercuando su actividad vinculada ya no está disponible. mientras que necesitamos destruir manualmente AsyncTasks si su actividad de llamada destruye. Esto ahorra nuestro tiempo de escribir todas las cosas de limpieza. AsyncTaskLoader juega bien con sus respectivos ciclos de vida.

Entonces, AsyncTaskLoader es mucho mejor que AsyncTask.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.