android - Pourquoi les fragments de remplacement répétés fuient-ils la mémoire?
漂亮男人
漂亮男人 2017-05-16 13:32:31
0
2
716

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 ;

Question 3 :

Devrions-nous éviter d'utiliser FRAGMENT (je sais qu'utiliser HIDE/SHOW est mieux que REPLACE

Merci !

漂亮男人
漂亮男人

répondre à tous(2)
世界只因有你

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal