Comme le montre l'image, lorsque vous cliquez sur les deux boutons ci-dessous, REPALCEIl y a deux Fragmnets ci-dessus et une fuite de mémoire s'est produite lors de commutations répétées
Voici le code du Fragment :
public class Fragment2 extends Fragment {
private List<Bitmap> lb = new ArrayList<>();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
allocBitMap();
allocBitMap();
return inflater.inflate(R.layout.f2, container, false);
}
private void allocBitMap() {
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.men);
lb.add(b);
}
@Override
public void onDestroy() {
Log.e("onDestroy", "yes, onDestroy");
super.onDestroy();
}
}
Cela fait partie du code d'activité
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_left:
transFragleft();
break;
case R.id.bt_right:
transFragright();
break;
}
}
Fragment f1 = new Fragment1();
Fragment f2 = new Fragment2();
private void transFragleft(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.rl_f, f1);
ft.commit();
}
private void transFragright(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.rl_f, f2);
ft.commit();
}
Voici l'état de la mémoire lors de commutations répétées :
Voici LOGCAT. Vous pouvez voir que onDestroy est exécuté et que tout le cycle de vie du fragment est terminé immédiatement
04-27 09:46:04.682 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy
04-27 09:46:06.344 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy
04-27 09:46:07.895 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy
Alors pourquoi la mémoire qu'il occupait est-elle toujours là ?
Question 2 :
Comment allouer une certaine quantité de mémoire en JAVA pour les expériences. Ma méthode bitmap est trop faible et elle contient du CONTEXTE ;
Devrions-nous éviter d'utiliser FRAGMENT (je sais qu'utiliser HIDE/SHOW est mieux que REPLACE
Intégrez LeakCanary dans le code pour voir la cause de la fuite de mémoire.
Et si le graphique mémoire augmente, cela ne signifie pas nécessairement une fuite de mémoire. Chaque fois que vous demandez un Bitmap, il se peut qu'il ne réponde pas aux normes GC, ce n'est donc pas un problème si la mémoire continue d'augmenter.
Ce n'est pas le problème du fragment, c'est le bitmap que vous utilisez