gpt4 book ai didi

android - 从 Where 子句创建 Observable 时 Android 中可能存在 Realm 内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 13:55:54 25 4
gpt4 key购买 nike

也许我不明白如何正确地使用 Realm 和 Observables,但是当我从一个 Realm Where 创建一个 Observable 并订阅它时,我似乎遇到了 Realm 内存泄漏。我在 onDestroy() 中关闭 Realm,并在 onPause() 中取消订阅 Observable。但是,如果我多次添加和退出以下 fragment (它被添加到 BackStack 并在返回时删除):

public class RealmFragment extends android.support.v4.app.Fragment {

private Realm mRealm;
private Subscription mSubscription;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_realm, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

mRealm = Realm.getDefaultInstance();

mSubscription = mRealm.where(Person.class)
.findAllAsync()
.asObservable()
.subscribe(new Action1<RealmResults<Person>>() {
@Override
public void call(RealmResults<Person> persons) {
Log.d("RXREALM", "OnNext called");
}
});
}

@Override
public void onPause() {
super.onPause();
mSubscription.unsubscribe();
}

@Override
public void onDestroy() {
super.onDestroy();
mRealm.close();
}
}

我注意到,如果我执行了几次 GC,然后在 Android studio 中进行了堆转储,那么 Realm 和 RealmResult 的多个实例等于我启动 Fragment 的次数。我在任何地方都没有提到它们。在我上次离开之后,没有对 RealmFragment 的引用。

我注意到如果我不取消订阅 Where 订阅,Realm 对象的数量不会增加。 RealmResults 的计数仍在增加。

我做了一个空项目来测试这个。 RxJava 和 Realm 是最新的。感谢任何关于为什么会发生这种情况或 Realm 如何管理 Observables 的澄清。当我调查这个问题时,可以在这里找到整个空项目:https://github.com/willjgriff/android-realm-leak

最佳答案

用于生成 Observable 的 Realm 代码在这里:https://github.com/realm/realm-java/blob/master/realm/realm-library/src/main/java/io/realm/rx/RealmObservableFactory.java

只要您不取消订阅一个 Observable,Realm 就会保留对它的强引用,但它应该在您取消订阅时释放该引用。

但是如果没有关于您的代码的更多上下文,很难准确判断发生了什么。你能发布一个完整的例子吗?

关于android - 从 Where 子句创建 Observable 时 Android 中可能存在 Realm 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39758862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com