Tengo un sistema de carga de datos configurado usando un Cargador y Cursor personalizado que funciona muy bien desde Actividades y Fragmentos, pero no hay un LoaderManager (que puedo encontrar) en el Servicio. ¿Alguien sabe por qué LoaderManager fue excluido del servicio? Si no hay una forma de evitar esto?¿Se puede usar un LoaderManager de un servicio?
Respuesta
¿Alguien sabe por qué LoaderManager fue excluido de servicio?
Como se indica en la otra respuesta, LoaderManager
fue diseñado expresamente para gestionar Loaders
a través de los ciclos de vida de Acivities
y Fragments
. Dado que Services
no tiene que hacer frente a estos cambios de configuración, no es necesario utilizar LoaderManager
.
¿Si no hay una forma de evitar esto?
Sí, el truco es que no es necesario utilizar un LoaderManager
, sólo puede trabajar con su Loader
directamente, que se encargará de cargar de forma asíncrona sus datos y el seguimiento de los cambios de datos subyacentes para usted, lo cual es mucho mejor que consultar sus datos manualmente.
Primero, cree, regístrese y comience a cargar su Loader
cuando se cree Service
.
@Override
public void onCreate() {
mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
mCursorLoader.startLoading();
}
A continuación, poner en práctica en sus OnLoadCompleteListener<Cursor>
Service
devoluciones de llamada de carga para manejar.
@Override
public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
// Bind data to UI, etc
}
Por último, no se olvide de limpiar su Loader
cuando el Service
se destruye.
@Override
public void onDestroy() {
// Stop the cursor loader
if (mCursorLoader != null) {
mCursorLoader.unregisterListener(this);
mCursorLoader.cancelLoad();
mCursorLoader.stopLoading();
}
}
Lamentablemente, no. Los cargadores se diseñaron para actividades y fragmentos a fin de manejar limpiamente los cambios de configuración que ocurren en Activites y Fragments. es decir, girar el dispositivo y volver a conectarlo a los datos existentes.
Un servicio no tiene ningún cambio de configuración, se quedará en segundo plano hasta que se complete o el sistema se vea obligado a matarlo. Por lo tanto, suponiendo que está ejecutando su código en una cadena de fondo en su Servicio (que debería ser de todos modos), no hay razón para usar un cargador. Simplemente realice las llamadas que necesita para consultar sus datos.
Por lo tanto, si su servicio es solo un servicio intencionado, puede escribir su lógica para consultar los datos respaldados por el cursor en el método onHandleIntent().
- 1. ¿Debo usar Fragmentos para obtener un LoaderManager?
- 2. ¿Cuál es el alcance de un LoaderManager?
- 3. ¿Se puede pasar un paquete a un servicio?
- 4. ¿Se puede usar un CollectionViewSource dentro de un DataTemplate?
- 5. ¿Se puede usar el compilador Mono como servicio en un contexto de depuración?
- 6. Android: CursorLoader, LoaderManager, SQLite
- 7. ¿Se puede consumir un servicio WCF como si fuera un servicio web ASP.NET?
- 8. ¿Cuándo no se debe usar un servicio web?
- 9. No se puede ejecutar ElasticSearch como un servicio en Ubuntu
- 10. ¿Cómo puede un servicio de Windows iniciar un proceso cuando se produce un evento de temporizador?
- 11. ¿Cómo se puede saber si se instala un servicio de Windows utilizando (preferentemente) solo un lote?
- 12. ¿Se puede usar stdio mientras se codifica un Kernel ...?
- 13. El servicio WCF no se puede iniciar cuando hay más de un servicio disponible
- 14. ¿Puede un servicio web devolver una transmisión?
- 15. ¿Puede un paquete de fragmentos OSGi publicar un servicio declarativo?
- 16. ¿Puede un servicio tener múltiples puntos finales?
- 17. ¿Puede un servicio Android tener múltiples permisos?
- 18. ¿Cuándo usar un servicio basado en aidl?
- 19. IllegalStateException - Soporte LoaderManager con AutocompleteTextView
- 20. Servicio de Android: parece que no puede encontrar un ejemplo.
- 21. ¿Se puede usar CQRS para un sitio como StackOverflow?
- 22. ¿Cómo se puede usar "First Responder" en un archivo xib?
- 23. ¿Se puede usar .Contains (string) con un Statement Select Case?
- 24. ¿Qué función se puede usar para ordenar un Vector?
- 25. ¿Se puede usar objetivos múltiples con un solo VBO?
- 26. No se puede usar por ciento (%) en un patrón Lua
- 27. ¿No se puede usar un método público estático?
- 28. Scala: ¿se puede usar varias veces con un bucle for?
- 29. ¿Se puede usar "dónde" para requerir un atributo en C#?
- 30. ¿Cómo se puede distinguir si se trata de un servicio web SOAP o REST?
eso es interesante. Supongamos que estamos en el medio de ejecutar 'onLoadComplete' y los datos del cursor cambian. ¿La ejecución de 'onLoadComplete' se detendrá abruptamente y comenzará de nuevo con el nuevo cursor? Solo estoy tratando de comprender cómo gestionar con elegancia una actualización de datos mientras se itera por el cursor en un servicio. – faizal
Por lo que he visto, dado que se llama a 'onLoadComplete' en el hilo principal' Service', cualquier llamada posterior a 'onLoadComplete' simplemente se apilaría y se ejecutaría con un nuevo' Cursor' luego de que 'onLoadComplete' terminara. Esto debería ser casi exactamente el mismo comportamiento que obtendría con un 'LoaderManager' llamando a' onLoadFinished' de varios cambios de datos posteriores. –
@StevenByle Creo que también debería llamar a 'mCursorLoader.reset() 'para cerrar el cursor. De acuerdo con el código fuente, 'reset()' llamará a 'onStopLoading();' (que es igual a 'stopLoading') y luego cerrará el cursor. Creo que, de lo contrario, el cursor no se cerrará. – MyDogTom