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>