2017-10-06 5 views
1

Mon MainActivity a un Drawer et instancie un nouveau Fragment, en fonction du MenuItem cliqué (basé sur this tutorial).Android/Java: l'instanciation de fragments provoque des fuites de mémoire?

J'ai suivi la mémoire, qui est en légère augmentation à chaque changement de Fragment et je vous inquiétez pas, ce fragmentClass.newInstance() n'est pas la bonne façon.

// MainActivity 
public boolean onNavigationItemSelected(MenuItem item) { 

    int id = item.getItemId(); 
    Fragment fragment = null; 
    Class fragmentClass = null; 
    if (id == R.id.nav_camera) { 
     fragmentClass = CameraFragment.class; 
    } else if (id == R.id.nav_gallery) { 
     fragmentClass = GalleryFragment.class; 
    } else if (id == R.id.nav_slideshow) { 
     fragmentClass = SlideshowFragment.class; 
    } else if (id == R.id.nav_manage) { 
     fragmentClass = ManageFragment.class; 
    } else if (id == R.id.nav_share) { 
     fragmentClass = ShareFragment.class; 
    } else if (id == R.id.nav_send) { 
     fragmentClass = SendFragment.class; 
    } 

    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.layout_main, fragment).commit(); 
} 

Je me attends quelque chose comme:

// Pseudocode 
if (fragmentManager.instanceExists(fragmentClass)) { 
    // load instantiated fragment 
} else { 
    // newInstance() 
} 

Comment pourrais-je éviter les fuites de mémoire ou est ce même lié?

Merci!

+1

Juste une observation, 'fragmentClass = CameraFragment.class' pourrait être écrit comme 'fragment = CameraFragment.newInstance()'. C'est un peu plus propre et vous n'aurez probablement plus besoin d'un bloc d'essai. – petey

Répondre

1

Pratiquement, il n'y a pas de problèmes dans ce code. Les choses que vous pouvez optimiser sont:

  1. Refonte méthode Fragment#instantiate() (vérifier docs)
  2. instances de mise en mémoire cache quelque chose comme Map afin de ne pas créer le nouveau chaque fois que vous naviguez dans le tiroir

également , vous pouvez vérifier si fragment existe dans FragmentManager en utilisant FragmentManager#findFragmentById() ou FragmentManager#findFragmentByTag()