Search code examples
javaandroidrealm

Realm Change Listenere stopped working


I am using Realm 3.5.0

I've added ChangeListener to RealmResults. Sometimes it stops working after few changes in RealmResults(like creation or removal object) and sometimes it takes some time to stop. I am using firebase to update realm database.

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);
                     }
                 }
            });
        }

This is how i delete object with dialog

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

And the way how i add new items through dialog

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);
                            }
                        });

I cannot find a solution to this problem on the internet. Thanks for the help in advance :)


Solution

  • Realm keeps a weak reference to your RealmResults for notifying it, so if you don't store it as a field variable, then it'll get garbage collected and will no longer be notified.

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

    Needs to be

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