有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java领域更改侦听器已停止工作

我使用的是Realm 3.5.0

我在RealmResults中添加了ChangeListener。有时,在RealmResults(如创建或删除对象)发生少量更改后,它会停止工作,有时需要一些时间才能停止。我正在使用firebase更新领域数据库

RealmResults<Prize> resPrizeListner = realm.where(Prize.class).equalTo("person", personPrize).findAll();
        if (personPrize.equals(user.getUid())) {
            resPrizeListner.addChangeListener(new RealmChangeListener<RealmResults<Prize>>() {
                 @Override
                 public void onChange(RealmResults<Prize> prizes) {
                     if (prizes.size() == 0) {
                         queryPrize = realm.where(Prize.class).equalTo("id", 0);
                         setAdapterPrizes(queryPrize);
                     } else if (prizes.size() > 0) {
                         queryPrize = realm.where(Prize.class).equalTo("person", personPrize);
                         setAdapterPrizes(queryPrize);
                     }
                 }
            });
        }

这是我用对话框删除对象的方式

final RealmResults<Prize> resPrizeDelete = realm.where(Prize.class)
                                .equalTo("id", id)
                                .findAll();

                        realm.executeTransaction(new Realm.Transaction() {
                            @Override
                            public void execute(Realm realm) {
                                Prize deletePrize = resPrizeDelete.get(0);

                                deletePrize.deleteFromRealm();
                            }
                        });

以及如何通过对话框添加新项目

realm.executeTransaction(new Realm.Transaction() {
                            @Override
                            public void execute(Realm realm) {

                                Prize prize = new Prize();

                                prize.setId(System.currentTimeMillis());
                                prize.setPerson(user.getUid());
                                ...
                                realm.copyToRealmOrUpdate(prize);
                            }
                        });

我在网上找不到解决这个问题的办法。提前感谢您的帮助:)


共 (1) 个答案

  1. # 1 楼答案

    Realm为RealmResults保留一个弱引用,用于通知它,因此如果不将其存储为字段变量,那么它将被垃圾收集,不再收到通知

    RealmResults<Prize> resPrizeListner = realm.where(Prize.class).equalTo("person", personPrize).findAll();
    

    需要

    RealmResults<Prize> prize;
    
    public void blah() {
        prize = realm.where(...).findAll();
        prize.addChangeListener(...)