2013-03-16 5 views
0

Je travaille sur une application (non écrite par moi) qui a une activité composée de trois onglets, chacun correspondant à son propre fragment (je n'ai jamais utilisé de fragments auparavant). Chaque onglet/fragment affiche des structures de données qui consomment beaucoup de mémoire. Je veux être confiant que lorsque je passe d'un onglet à l'autre que la mémoire consommée par l'onglet/fragment sortant est entièrement libérée. avant que le prochain démarre. Ainsi, par exemple, il y avait une image bitmap affichée par le fragment sortant - serait-il essentiel de faire d'abord un bitmap.release() pour s'assurer que le fragment libère toute sa mémoire? Écoute un événement de changement d'onglet sur votre contrôleur d'onglet.onglets/fragments et fuite de mémoire

Répondre

0

tabLayout.setOnTabChangedListener(<listener>); 

sur la méthode de rappel de votre auditeur (onTabChanged(int index, boolean isUserInput)), obtenir le fragment précédent, appelez dessinables unbind sur son point de vue d'une manière récursive (u besoin de l'écrire). Après l'avoir fait, vous pouvez également appeler le System.gc() pour donner un indice à Dalvik VM d'exécuter le garbage collector (juste un indice, aucune garantie).

exemple de code pour la déliaison:

public static void unbindDrawables(@Nullable View view) { 
    if (view == null) { 
     return; 
    } 

    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 

    if (view instanceof ImageView && ((ImageView) view).getDrawable() != null) { 
     ((ImageView) view).getDrawable().setCallback(null); 
    } 

    if (view instanceof ViewGroup) { 
     if (view instanceof AbsListView) { 
      // Clean out list view 
      List<View> cells = Lists.newLinkedList(); 
      ((AbsListView) view).reclaimViews(cells); 
      if (cells != null) { 
       for (View c : cells) { 
        unbindDrawables(c); 
       } 
      } 
     } else { 
      for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
       unbindDrawables(((ViewGroup) view).getChildAt(i)); 
      } 
     } 
    } 
}