RealmChangeListener没有按我的预期工作,下面是我对它的处理方法:

public ArrayList<NotificationMessage> getNotifications(RealmChangeListener<RealmResults<NotificationMessage>> listener) {
    RealmResults<NotificationMessage> results = realm.where(NotificationMessage.class).findAll();
    results.addChangeListener(listener);
    return (ArrayList) realm.copyFromRealm(results);
}

public void addNotification(NotificationMessage notif) {
    realm.beginTransaction();
    realm.copyToRealm(notif);
    realm.commitTransaction();
}

基本上我使用realm来存储gcm消息。我的GCMListenerService在他收到通知时调用addNotification(),我有一个片段显示这些通知,这些通知在创建时调用getNotifications(this)。它实现RealmChangeListener<RealmResults<NotificationMessage>>
@Override
public void onChange(RealmResults<NotificationMessage> element) {
    RecyclerAdapter.refreshDataSet(Realm.getDefaultInstance().copyFromRealm(element));
}

我的问题是大部分时间都不调用onChange()。有时是,有时是连续几次,然后不再调用它(除了刷新发送消息给gcm的web页面之外什么都不做)。通知很好地存储在数据库中,如果我再次调用getNotifications我将看到它们。
我今天早上从realm开始,所以如果你对我应该如何组织我的“realm”代码有建议,我会通知你的。
public static <T extends RealmObject> ArrayList<T> convertRealmToPlainObject(RealmResults<T> results) {
    ArrayList<T> returnedData = new ArrayList<>();
    Iterator<T> it = results.iterator();
    while (it.hasNext()) {
        returnedData.add(it.next());
    }
    return returnedData;
}

最佳答案

从你的描述中很难给出具体的建议,但有几点:
更改侦听器仅在循环器事件上触发。因此,如果在处理事件时有多个写操作。它只会触发一个onChange调用。
关闭域意味着不再触发更改侦听器。
ChangeListeners不适用于普通对象。

关于android - Realm的RealmChangeListener具有我不了解的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37166296/

10-12 02:32