我正在尝试解决有关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上搜索解决方案,但没有成功。
提前致谢
答案 0 :(得分:2)
好吧,
答案非常简单,正如 @beeender 指出的那样,结果得到了GCed 。我没有意识到,即使我有一个局部变量final RealmResults<User> result
我将. findAllSortedAsync
的结果分配给它,它在方法体执行后几乎立即得到了GC。
因此,解决方案是将RealmResults<User> result
从局部变量更改为实例变量。