android - oncreateloader - loadermanager
Guía para elegir entre AsyncTaskLoader y AsyncTask para usar en Fragmento (2)
Mire LoaderCustomSupport (Use AsyncTaskLoader) y FragmentRetainInstanceSupport (Use Thread, casi equivalente a AsyncTask)
Ambos ejemplos tienen las siguientes similitudes.
- Ambos no bloquean el hilo de la interfaz de usuario al cargar datos
- El hilo de obtención de datos no se destruye cuando el usuario realiza cambios de configuración como la rotación de la pantalla.
- Cuando el subproceso de obtención de datos finalizó la obtención de datos, se puede actualizar a la IU de fragmentos correcta.
Sin embargo, hay diferencias.
AsyncTaskLoader
- Parece que no hay una manera fácil de actualizar el progreso intermedio a un cuadro de diálogo de la barra de progreso
AsyncTask
- No estoy seguro de esto. ¿Pero la documentación de Android parece recomendar AsyncTaskLoader para la carga asíncrona de datos y la actualización del resultado final a la interfaz de usuario ?
¿Hay alguna pauta, o lista de verificación, para decidir si elegir AsyncTaskLoader o AsyncTask, para realizar una tarea de carga que requiere mucho tiempo y actualizar el resultado a la interfaz de usuario de Fragment?
Los AsyncTaskLoaders, como todos los cargadores, están destinados a resolver el problema de rotación, que es cuando se crea una AsyncTask en una Actividad, luego el dispositivo se gira antes de que la tarea haya finalizado, AsyncTask se perderá con la destrucción de la Actividad.
Es cierto que todos los cargadores actualmente no admiten el progreso de publicación, por lo que si este es un requisito para su situación, entonces debería considerar una alternativa. Si la rotación, o cualquier otro evento que cause que la Actividad se destruya, no es un problema, simplemente use una AsyncTask, de lo contrario, puede usar un Servicio y registrar un archivador para enviar mensajes de progreso hacia adelante y hacia atrás.
Sin embargo, en mi opinión, los mensajes de servicio y carpeta son un poco molestos. Encuentro que una solución mucho más fácil es usar LocalBroadcastManager para enviar transmisiones de progreso desde un IntentService (o AsyncTaskLoader) y tener un BroadcastReceiver en la Actividad para recibir la transmisión y mostrar el progreso.
Tu pregunta me hizo interesarme y, a veces, intenté analizar las diferencias. Aquí estoy escribiendo mis observaciones.
Para la terminación prematura, la tarea asíncrona que utiliza AsyncTask continuará ejecutándose en su hilo. El procesamiento de los resultados pronto puede llevar a resultados no solicitados, mientras que AsyncTaskLoader maneja la terminación prematura de la actividad.
AsyncTaskLoader maneja los cambios de configuración de la actividad (IE cuando el usuario gira la pantalla).
AsyncTaskLoader está diseñado para cargar datos para los adaptadores de datos, por lo que para este propósito es mejor usar AsyncTaskLoader. Pero si necesita cambiar la interfaz de usuario (especialmente los fragmentos) después de completar la tarea, es mejor usar AsyncTask, ya que no puede cambiar los fragmentos en uno de los complementos de AsynTaskLoader.
Así que para mí el uso depende de tu tarea. y si los 3 puntos anteriores no le molestan, entonces el rendimiento es el mismo (aunque no he encontrado ningún documento, pero en este caso se recomienda asynctaskloader: S)
algunos enlaces relacionados
http://andreas-kluck.blogspot.com/2012/02/asynctask-and-asynctaskloader.html