Realm的RealmChangeListener作为匿名类不会每次都被调用

时间:2016-08-07 14:45:12

标签: java android realm

我正在尝试解决有关Realm的RealmChangeListener作为匿名类添加的问题。问题是,有时它会被调用,但有时不会被调用。但是,如果类实现了RealmChangeListener并且查询被添加为this,那么一切正常。

在下面的示例中,当我打开应用程序时,会向本地存储库发出4个请求,以同时从数据库加载数据。因此,getUsers方法被调用4次,每次都有不同的User.Type值。但是,大多数情况下(80%)RealmChangeListener只被调用一次。

这不起作用

public class Repo {

    Reaml mRealm;

    public Repo(@Inject Realm realm){
        this.mReal = realm;
    }

    public void getUsers(User.Type type, Callbacks callbacks){
        mRealm.where(User.class)
            .equalTo("type", type.name())
            .findAllSortedAsync("firstName", Sort.ASCENDING)
            .addChangeListener(new new RealmChangeListener<RealmResults<User>>() {
                @Override
                public void onChange(RealmResults<User> element) {
                    if (element.isLoaded()) {
                        Log.d("%s users are loaded", type.name());
                        callbacks.onUsersLoaded(element);
                        element.removeChangeListener(this);
                    }
                }
            }));
        }
    }
}

但是,如果Repo类实现了RealmChangeListener并将其作为this引用传递给RealmResults,则会正确调用它4次。

这有效!

public class Repo implements RealmChangeListener<RealmResults<User>>{

    Reaml mRealm;

    public Repo(@Inject Realm realm){
        this.mReal = realm;
    }

    public void getUsers(User.Type type, Callbacks callbacks){
        mRealm.where(User.class)
            .equalTo("type", type.name())
            .findAllSortedAsync("firstName", Sort.ASCENDING)
            .addChangeListener(this);
    }

    @Override
    public void onChange(RealmResults<User> element) {
        if (element.isLoaded()) {
            Log.d("Users are loaded from THIS");
            callbacks.onUsersLoaded(element);
            element.removeChangeListener(this);
        }
    }
}

你有什么建议可能是一个问题,我怎么能解决?我想使用匿名类而不是this的引用。 我试图在SO,Realm的文档,GitHub上搜索解决方案,但没有成功。

提前致谢

1 个答案:

答案 0 :(得分:2)

好吧,

答案非常简单,正如 @beeender 指出的那样,结果得到了GCed 。我没有意识到,即使我有一个局部变量final RealmResults<User> result我将. findAllSortedAsync的结果分配给它,它在方法体执行后几乎立即得到了GC。

因此,解决方案是将RealmResults<User> result从局部变量更改为实例变量。