当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插入任何内容,则不会调用一个RealmChangeListenerNLService

我试图直接附加RealmResults RealmRealmResultsRealmObject ,没有任何工作。

该应用程序具有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();