Я получаю неизвестную утечку памяти, когда закрываю какой-либо фрагмент - PullRequest
1 голос
/ 03 мая 2020

Я создаю приложение для блога и получаю утечку памяти, когда закрываю какой-либо фрагмент .... Я пытаюсь найти ответ, и некоторые говорят, что нужно обнулить ссылку на ваши взгляды на onDestroyView или onDestroy (я пробовал и то, и другое, но работать), а затем я только что создал пустой фрагмент без каких-либо представлений (просто синий фон), и даже если я закрываю BlankFragment, все равно я получаю ту же утечку памяти ... следуйте код, который я использую для добавления пустого фрагмента

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

и после того, как я закрываю только пустой фрагмент, который не содержит никаких представлений .. Я получаю следующее предупреждение об утечке памяти в 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 голосов
/ 04 мая 2020

UserProfile_Fragment.transaction является вероятной причиной утечки, вы не должны хранить транзакцию фрагмента в памяти, так как она содержит BlankFragment.

...