android - RealmChangeListener does not get called when Realm gets updated in NotificationListenerService -
i'm doing realm insertions on extended notificationlistenerservice, this:
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; } } using realm newer v0.88.3, not single realmchangelistener (rcl) gets called if gets inserted in nlservice.
i tried attaching rcl's directly realm, realmresults , realmobject, nothing works.
the app has example simple rcl's realmresults<myrealmobject>.size() , several recycleradapters , rcl inside realmrecyclerviewadapter never called.
rerunning queries works , "missing data" shows up. if gets inserted on ui- or other thread, rcl's called , "missing data" shows up.
i stayed months on realm 0.88.3 because can not bring work newer realm version. 0.88.3 mrealm.refresh(); called in nlservice, not available in newer versions , .waitforchange blocks endlessly.
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>
i can see 2 solutions this, either use looper thread (handlerthread) setautorefresh(true) (and call setautorefresh(false) before looper.quit()), or force refresh realm instance on thread.
note: relies on package-internal methods. beware.
in v 1.1.1 (and v1.2.0), - , version before 3.0.0 - instead of following line
// mrealm.waitforchange(); / mrealm.refresh(); you force update on local thread through handlercontroller associated realm instance using package-internal stuff
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); } } and call
mrealm = realm.getdefaultinstance(); realmhelper.saveobj(myrealmobject, mrealm); realmrefresh.refreshrealm(mrealm); mrealm.close(); please note change log's breaking changes though, because 0.89.0 changed iteration behavior, , results no longer live during active transaction; 3.0.0 again.
however, must note if notificationlistenerservice running in remote process, realm instances won't able notify each other.
edit:
in realm java 3.0.0, notification behavior changed completely, , handlercontroller no longer exists.
instead, following should work:
package io.realm; public class realmrefresh { public static void refreshrealm(realm realm) { realm.sharedrealm.refresh(); } } edit:
in realm 3.2.+, available with
realm.refresh();
Comments
Post a Comment