Tengo un sistema de carga de datos se configura utilizando una costumbre Cargador y el Cursor que está funcionando muy bien, de las Actividades y de los Fragmentos, pero no hay LoaderManager (lo que me pueda encontrar) en el Servicio. ¿Alguien sabe por qué LoaderManager fue excluido de Servicio? Si no hay una forma de evitar esto?

InformationsquelleAutor David Sauter | 2012-01-01

2 Comentarios

  1. 52

    ¿Alguien sabe por qué LoaderManager fue excluido de Servicio?

    Como se indica en la otra respuesta, LoaderManager fue explícitamente diseñado para administrar Loaders a través de los ciclos de vida de Acivities y Fragments. Desde Services no tienen estos cambios en la configuración de acuerdo con, el uso de un LoaderManager no es necesario.

    Si no hay una forma de evitar esto?

    Sí, el truco es que usted no necesita el uso de un LoaderManager, usted puede trabajar con su Loader directamente, que va a controlar de forma asíncrona la carga de datos y el control de datos subyacentes de los cambios para usted, que es mucho mejor que la consulta de sus datos de forma manual.

    Primero, crear, registrar y empezar a cargar su Loader cuando su Service es creado.

    @Override
    public void onCreate() {
        mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
        mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
        mCursorLoader.startLoading();
    }

    Siguiente, implementar OnLoadCompleteListener<Cursor> en su Service para manejar la carga de las devoluciones de llamada.

    @Override
    public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
        //Bind data to UI, etc
    }

    Por último, no olvides limpiar tu Loader cuando el Service es destruido.

    @Override
    public void onDestroy() {
    
        //Stop the cursor loader
        if (mCursorLoader != null) {
            mCursorLoader.unregisterListener(this);
            mCursorLoader.cancelLoad();
            mCursorLoader.stopLoading();
        }
    }
    • que interesante. Supongamos que estamos en algún lugar en el medio de la ejecución de onLoadComplete y el cursor cambios en los datos. Será la ejecución de onLoadComplete detener abruptamente y empezar de nuevo con el nuevo cursor? Sólo estoy tratando de entender cómo tratar correctamente una actualización de datos, mientras que recorrer el cursor en un servicio.
    • Por lo que he visto, desde onLoadComplete se llama en el Service's hilo principal, cualquier llamada subsiguiente a onLoadComplete simplemente pila y ejecutar con un nuevo Cursor después de la inicial onLoadComplete acabados. Este debe ser casi exactamente el mismo que el comportamiento se obtendría con un LoaderManager llamar onLoadFinished de varios de los posteriores cambios en los datos.
    • Creo que también se debería llamar mCursorLoader.reset()' in order to close cursor. According to source code, 'reset()' will call onStopLoading();` (que es igual a stopLoading) y, a continuación, se cerrará el cursor. Creo que, de lo contrario cursor no será cerrado.
    • este sorta funciona, pero no hay ninguna garantía de que el servicio se completa la solicitud en un plazo de tiempo razonable.
  2. 18

    Por desgracia, no. Cargadores fueron diseñados para las actividades y los fragmentos con el fin de limpiamente manejar los cambios de configuración que se producen en las Actividades y los Fragmentos. es decir, la Rotación de su dispositivo y volver a unir a los datos existentes.

    El servicio no tiene ningún cambio en la configuración, se sentará en el fondo hasta que se complete o el sistema se ve obligado a matarlo. Así, suponiendo que usted está ejecutando su código en un subproceso en segundo plano en su Servicio (que debe ser de todos modos), theres simplemente no hay razón para utilizar un Cargador. Simplemente hacer las llamadas que usted necesita para la consulta de sus datos.

    Así que si su Servicio es sólo un IntentService, usted puede escribir su lógica a la consulta de su cursor-copia de los datos en el onHandleIntent() método.

    http://developer.android.com/guide/components/loaders.html

Dejar respuesta

Please enter your comment!
Please enter your name here