当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();