Realm的RealmChangeListener有一个我不理解的行为

时间:2016-05-11 14:53:37

标签: android realm

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

我的问题是大多数时候getNotifications没有被调用。有时它有时会连续几次,然后它不再被调用(除了刷新我的网页以发送消息给GCM之外什么都没做)。通知很好地存储在数据库中,如果我再次呼叫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; } ,我会全部看到它们。

我今天早上从领域开始,所以如果你有关于如何组织我的“领域”代码的建议,我会感到高兴。

pin.onkeypress = function (e) {
   return e.charCode >= 48 && e.charCode <= 57;
};

1 个答案:

答案 0 :(得分:2)

根据你的描述,很难给出具体的建议,但有几点建议:

  • 更改侦听器仅在Looper事件上触发。因此,如果您在处理事件时有多次写入。它只会触发一次onChange来电。

  • 关闭领域意味着不再会触发更改侦听器。

  • Changelisteners不适用于普通对象。