Dans un Fragment
avec l'interface utilisateur, vous économisez souvent quelques View
s en tant qu'état d'instance pour accélérer l'accès. Par exemple un lien vers votre EditText
de sorte que vous n'avez pas à findViewById
tout le temps. Le problème est qu'un View
conserve une référence au contexte Activity
. Maintenant, si vous conservez un View
, vous conservez également une référence à ce contexte.
Cela ne pose aucun problème si le contexte est toujours valide, mais le cas typique de conservation est le redémarrage de l'activité. Très souvent pour une rotation d'écran par exemple. La récréation d'activité va créer un nouveau contexte et les anciens contextes sont destinés à être collectés. Mais il ne peut pas être collecté maintenant puisque votre Fragment
a toujours une référence à l'ancien.
L'exemple suivant montre comment ne pas le faire
public class LeakyFragment extends Fragment {
private View mLeak; // retained
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mLeak = inflater.inflate(R.layout.whatever, container, false);
return mLeak;
}
@Override
public void onDestroyView() {
super.onDestroyView();
// not cleaning up.
}
}
Pour se débarrasser de ce problème, vous devez effacer toutes les références à votre interface utilisateur dans onDestroyView
. Une fois l'instance Fragment
réutilisée, il vous sera demandé de créer une nouvelle interface utilisateur au onCreateView
. Il est également inutile de conserver l'interface utilisateur après onDestroyView
. L'Ui ne va pas être utilisé.
Le correctif dans cet exemple est simplement en train de changer onDestroyView
à
@Override
public void onDestroyView() {
super.onDestroyView();
mLeak = null; // now cleaning up!
}
Et en plus de garder les références à View
s vous devriez évidemment pas garder les références à la Activity
(par exemple de onAttach
- propre à onDetach
) ou Context
tout (sauf si c'est le contexte Application
).
Juste pour documenter le sujet, voici les discussions similaires: http://stackoverflow.com/q/11182180/693752 – Snicolas
http: // stackoverflow. com/q/11160412/693752 – Snicolas