0

Мне нужно оптимизировать память в моем приложении. Когда фрагмент закрыт, мне нужно освободить память, используемую этим фрагментом.Свободная память фрагмента

Я делаю следующие шаги, чтобы высвободить память

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    txt_legal_1 = null; 
    txt_legal_2 = null; 
    progressBar = null; 
    mHandler = null; 
    prefs = null; 
    content = null; 
    System.runFinalization(); 
    Runtime.getRuntime().gc(); 
    System.gc(); 
} 

Но до сих пор память не свободно up.Can любой-одна помощь по этому вопросу?

+0

сделать все ваши поля в вашем частном фрагменте, он будет делать трюк для вас –

ответ

0

Посмотрите на свой код операции, я уверен, что что-то ссылается на Фрагмент или на его поле. Java Garbage Cleaner не может очищать объект из памяти, если по крайней мере одна ссылка сохраняется (может быть даже какой-то прослушиватель, приемник или т. Д.)

Также вы не можете ожидать, что запущенный System.gc() очистит памяти, на самом деле вы просто намекаете на систему для очистки. Вы можете посмотреть, будет ли GC успешно завершена на вкладке «Монитор» в Android Studio. Существует кнопка «Инициировать GC», с которой GC действительно запустится. И если вы заметите, что потребление памяти не изменится, это будет означать, что вы сделали что-то не так, и что-то еще сохраняет ссылку Fragment (или поле).

0

Рассмотрите возможность использования Leak Canary.

Он помогает обнаруживать и исправлять утечки памяти.

0

попробовать это: в вашем фрагменте

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    removeListeners(); //remove any listener.. 
    try { 
     getActivity().unregisterReceiver(receiver); //unregister any receiver that you register in fragment 
     unbindDrawables(rootView.findViewById(R.id.coordinator)); //R.id.coordinator is the root layout of your fragment view 
     System.gc(); 
    } catch (Exception e) { 

    } 
} 


//free up any drawables..views 
private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     if (!(view instanceof AdapterView<?>)) 
      ((ViewGroup) view).removeAllViews(); 
    } 
}