英文:
I am getting unknown memory leak whenever I am closing any fragment
问题
你的应用中出现了内存泄漏问题,即使在关闭任何片段时也会出现。根据你提供的信息,可能是因为在关闭片段时没有正确地清空视图引用所导致的。以下是你提到的一段代码,我将进行翻译:
Fragment blankFragment = new BlankFragment();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.hide(userProfileFragment); //隐藏当前片段 userProfileFragment
transaction.add(R.id.frame_container, blankFragment,"blank");
transaction.addToBackStack(null);
transaction.commit();
此外,你提到在关闭即使是一个不包含任何视图的 BlankFragment 时仍然出现内存泄漏警告。根据 Leak Canary 给出的信息,问题可能出现在 BlankFragment
实例上,因为它接收到了 Fragment#onDestroy()
回调,且 Fragment#mFragmentManager
为 null。
为了解决内存泄漏问题,你可能需要仔细检查以下几点:
-
在片段的生命周期方法中,确保你正确地清空视图引用,尤其是在
onDestroyView()
方法中。这是防止视图引用导致内存泄漏的常用做法。 -
确保在关闭片段之前,你取消任何可能仍在执行的异步任务、监听器或回调,以免它们持有对片段的引用。
-
考虑使用
FragmentTransaction.remove()
方法来移除片段,而不是隐藏它们,以确保片段及其相关资源得到正确地释放。 -
在
BlankFragment
中,也要确保在onDestroyView()
方法中正确地清空任何可能持有对其他对象的引用的内容。
以上是一些可能有助于解决内存泄漏问题的建议。请根据你的应用情况检查这些方面,并根据需要进行调整。
英文:
I am making blog app and getting memory leak when ever I closing any fragment....I try to find answer and some says to null out your views reference on onDestroyView or onDestroy(I tried it both and it don't work) and than I just created blank fragment without any views(just a blue background ) and even if I am closing BlankFragment ,still I am getting same memory leak...follow is the code I am using to add blank fragment
Fragment blankFragment = new BlankFragment();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.hide(userProfileFragment); //hiding userProfileFragment which is current fragment
transaction.add(R.id.frame_container, blankFragment,"blank");
transaction.addToBackStack(null);
transaction.commit();
and after I am closing just even a blankFragment which does not hold any views..I am getting the following memory leak warning in Leak Canary
┬───
│ GC Root: System class
│
├─ leakcanary.internal.InternalLeakCanary class
│ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│ ↓ static InternalLeakCanary.resumedActivity
├─ MainActivity instance
│ Leaking: NO (HomeFragment↓ is not leaking and Activity#mDestroyed is false)
│ ↓ MainActivity.startingFragment
├─ HomeFragment instance
│ Leaking: NO (UserProfile_Fragment↓ is not leaking and Fragment#mFragmentManager is not null)
│ Fragment.mTag=home
│ ↓ HomeFragment.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│ Leaking: NO (UserProfile_Fragment↓ is not leaking)
│ ↓ FragmentManagerImpl.mAdded
├─ java.util.ArrayList instance
│ Leaking: NO (UserProfile_Fragment↓ is not leaking)
│ ↓ ArrayList.elementData
├─ java.lang.Object[] array
│ Leaking: NO (UserProfile_Fragment↓ is not leaking)
│ ↓ Object[].[3]
├─ UserProfile_Fragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ Fragment.mTag=user
│ ↓ UserProfile_Fragment.transaction
│ ~~~~~~~~~~~
├─ androidx.fragment.app.BackStackRecord instance
│ Leaking: UNKNOWN
│ ↓ BackStackRecord.mOps
│ ~~~~
├─ java.util.ArrayList instance
│ Leaking: UNKNOWN
│ ↓ ArrayList.elementData
│ ~~~~~~~~~~~
├─ java.lang.Object[] array
│ Leaking: UNKNOWN
│ ↓ Object[].[1]
│ ~~~
├─ androidx.fragment.app.FragmentTransaction$Op instance
│ Leaking: UNKNOWN
│ ↓ FragmentTransaction$Op.mFragment
│ ~~~~~~~~~
╰→ BlankFragment instance Leaking: YES (ObjectWatcher was watching this because BlankFragment received Fragment#onDestroy() callback and Fragment#mFragmentManager is null)
答案1
得分: 0
UserProfile_Fragment.transaction 可能是泄漏的主要原因,不应将片段事务保存在内存中,因为它会保留 BlankFragment。
英文:
UserProfile_Fragment.transaction is the likely cause of the leak, you shouldn't hold the fragment transaction in memory as it keeps the BlankFragment.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论