我正在扩展 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,而不是一个 RealmChangeListener
如果在 NLService
中插入任何内容,将调用 (rcl) .
我尝试将 rcl 直接附加到 Realm
, RealmResults
和 RealmObject
,没有任何作用。
该应用程序具有例如 RealmResults<myRealmObject>.size()
的简单 rcl和
几个 RecyclerAdapter 和里面的 rcl RealmRecyclerViewAdapter
永远不会被调用。
然而,重新运行查询是有效的,“丢失的数据”出现了。 此外,如果在 ui- 或任何其他线程上插入了任何内容,则会调用 rcl 并显示“丢失数据”。
我在 Realm 0.88.3 上呆了几个月,因为我不能让它与任何更新的 Realm 版本一起工作。与 0.88.3 mRealm.refresh();
在 NLService 中调用,这在较新版本和 .waitForChange
中不可用无限阻塞。
list .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>
最佳答案
我可以看到两个解决方案,要么使用循环线程 (HandlerThread) 和 setAutoRefresh(true)
(并在 Looper 之前调用
),或者强制刷新线程上的 Realm 实例。setAutoRefresh(false)
.quit()
注意:这依赖于包内部方法。当心。
在 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();
请注意更改日志的重大更改,因为 0.89.0 更改了迭代行为,并且结果在 Activity 事务期间不再有效;但是从 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();
关于android - 在 NotificationListenerService 中更新 Realm 时,不会调用 RealmChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833163/