android realm

android - RealmChangeListener no recibe llamadas cuando Realm se actualiza en NotificationListenerService



(1)

Puedo ver dos soluciones para esto, usar un hilo looper (HandlerThread) con setAutoRefresh(true) (y llamar a setAutoRefresh(false) antes de Looper.quit() ), o forzar una actualización para la instancia de Realm en el hilo.

NOTA: Esto se basa en métodos internos del paquete. Tener cuidado.

En v 1.1.1 (y v1.2.0), y cualquier versión anterior a 3.0.0, en lugar de la siguiente línea

// mRealm.waitForChange(); / mRealm.refresh();

Puede forzar la actualización en el hilo local a través del HandlerController asociado con la instancia de Realm usando cosas internas del paquete

package io.realm; public class RealmRefresh { public static void refreshRealm(Realm realm) { Message message = Message.obtain(); message.what = HandlerControllerConstants.LOCAL_COMMIT; realm.handlerController.handleMessage(message); } }

Y luego llama

mRealm = Realm.getDefaultInstance(); RealmHelper.saveObj(myRealmObject, mRealm); RealmRefresh.refreshRealm(mRealm); mRealm.close();

Sin embargo, tenga en cuenta los cambios de ruptura del registro de cambios, porque 0.89.0 cambió el comportamiento de iteración y los resultados ya no están disponibles durante una transacción activa; pero desde 3.0.0 son de nuevo.

Sin embargo, también debo tener en cuenta que si su NotificationListenerService se ejecuta en un proceso remoto, las instancias de Realm no podrán notificarse entre sí.

EDITAR:

En Realm Java 3.0.0, el comportamiento de notificación se cambió por completo y HandlerController ya no existe.

En cambio, lo siguiente debería funcionar:

package io.realm; public class RealmRefresh { public static void refreshRealm(Realm realm) { realm.sharedRealm.refresh(); } }

EDITAR:

En Realm 3.2. +, Todo esto está disponible con

realm.refresh();

Estoy haciendo inserciones de Realm en un NotificationListenerService extendido, como este:

public class NLService extends NotificationListenerService { @Override public void onNotificationPosted(StatusBarNotification sbn) { // building realmObject here mRealm = Realm.getDefaultInstance(); RealmHelper.saveObj(myRealmObject, mRealm); // mRealm.waitForChange(); / mRealm.refresh(); mRealm.close(); } } public class RealmHelper { public static RealmModel saveObj(RealmObject realmObject, Realm realm) { realm.beginTransaction(); RealmObject newRealmObject = realm.copyToRealm(realmObject); realm.commitTransaction(); return newRealmObject; } }

Usando Realm más nuevo que v0.88.3, ​​no se llama a ningún RealmChangeListener ( rcl ) si se inserta algo en NLService .

Intenté adjuntar rcl''s directamente a Realm , RealmResults y RealmObject , nada funciona.

La aplicación tiene, por ejemplo, simples rcl para RealmResults<myRealmObject>.size() y varios RecyclerAdapters y nunca se llama al rcl dentro de RealmRecyclerViewAdapter .

Sin embargo, volver a ejecutar las consultas funciona y aparecen los "datos faltantes". Además, si se inserta algo en ui o en cualquier otro subproceso, se llama a rcl y se muestran los "datos faltantes".

Me quedé durante meses en Realm 0.88.3 porque no puedo ponerlo a trabajar con ninguna versión más reciente de Realm. Con 0.88.3 mRealm.refresh(); fue llamado en NLService, esto no está disponible en versiones más nuevas y los bloques .waitForChange interminablemente.

Manifest.xml:

<service android:name=".service.NLService" android:label="@string/nl_service" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService"/> </intent-filter> </service>