¿Cuál es el mecanismo de setNotificationUri?

Acabo de implementar un CursorLoader y funciona muy bien! De hecho, no creí que mi ListView actualizaría automáticamente cuando los datos subyacentes cambiaran hasta que lo probé. Esto aparentemente es la magia de setNotificationUri.

Mi pregunta es, ¿cómo sabe cuando los datos en el cursor ha cambiado? Decir que en silencio insertar una fila adicional en alguna parte. ¿El mecanismo subyacente consulta constantemente la base de datos y la compara con los datos anteriores? ¿No será horriblemente ineficiente si los conjuntos de datos son grandes?

Antes de utilizar cursorloaders, actualizaría manualmente cuando fuera necesario. Es genial que no tenga que hacer esto más, pero es eficiente dejar que el CursorLoader a esto en el fondo?

Por favor, corrija si estoy equivocado en alguna parte.

ContentProvider llama a algo como esto en el método de query(…) :

 // Tell the cursor what uri to watch, so it knows when its source data changes cursor.setNotificationUri(getContext().getContentResolver(), uri); 

CursorLoader recupera el cursor y registra un observador.

 /* Runs on a worker thread */ @Override public Cursor loadInBackground() { Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection, mSelectionArgs, mSortOrder); if (cursor != null) { // Ensure the cursor window is filled cursor.getCount(); registerContentObserver(cursor, mObserver); } return cursor; } /** * Registers an observer to get notifications from the content provider * when the cursor needs to be refreshed. */ void registerContentObserver(Cursor cursor, ContentObserver observer) { cursor.registerContentObserver(mObserver); } 

Cuando alguien modifica datos, ContentProvider notifica a ContentResolver sobre los cambios:

 getContext().getContentResolver().notifyChange(uri, null); 

ContentResolver a su vez notifica a todos los observadores registrados.

Observer, registrado por CursorLoader , lo obliga a cargar nuevos datos.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.