当Realm在NotificationListenerService中更新时,RealmChangeListener不会被调用
我在扩展的NotificationListenerService上做Realm插入,就像这样:
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; } }
使用比v0.88.3更新的Realm,如果在NLService
插入任何内容,则不会调用一个RealmChangeListener
( NLService
。
我试图直接附加RealmResults
Realm
, RealmResults
和RealmObject
,没有任何工作。
该应用程序具有RealmResults<myRealmObject>.size()
和几个RecyclerAdapter的RealmRecyclerViewAdapter
从不被调用。
重新运行的查询然而工作,并且“丢失的数据”显示。 另外,如果任何东西被插入ui-或任何其他线程,rcl的被调用和“缺less数据”出现。
我在Realm 0.88.3上呆了好几个月,因为我无法将它与任何更新的Realm版本配合使用。 用0.88.3 mRealm.refresh();
在NLService中被调用,这在更新的版本中不可用并且.waitForChange
块无休止地被使用。
的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>
我可以看到两个解决scheme,或者使用setAutoRefresh(true)
(并在Looper.quit()
之前调用setAutoRefresh(false)
Looper.quit()
线程(HandlerThread),或者强制刷新线程上的Realm实例。
注意:这依赖于包内部方法。 谨防。
在v 1.1.1(和v1.2.0)中,以及3.0.0之前的任何版本 – 而不是以下行
// mRealm.waitForChange(); / mRealm.refresh();
你可以使用包内部的东西,通过与Realm实例关联的HandlerController
强制本地线程的更新
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); } }
然后打电话
mRealm = Realm.getDefaultInstance(); RealmHelper.saveObj(myRealmObject, mRealm); RealmRefresh.refreshRealm(mRealm); mRealm.close();
尽pipe如此,请注意更改日志的重大更改,因为0.89.0更改了迭代行为,并且在活动事务期间结果不再有效; 但从3.0.0他们再次。
但是,我还必须注意,如果NotificationListenerService
在远程进程中运行,则Realm实例将无法通知对方。
编辑:
在Realm Java 3.0.0中,通知行为已完全更改, HandlerController
不再存在。
相反,以下应该工作:
package io.realm; public class RealmRefresh { public static void refreshRealm(Realm realm) { realm.sharedRealm.refresh(); } }
编辑:
在Realm 3.2。+中,这是所有可用的
realm.refresh();