In einem mit UI speichern Sie oft einige View
s als Instanzstatus, um den Zugriff zu beschleunigen. Zum Beispiel ein Link zu Ihrem EditText
so müssen Sie nicht findViewById
es die ganze Zeit.
Das Problem ist, dass ein View
einen Verweis auf den Activity
Kontext behält. Wenn Sie nun eine View
beibehalten, behalten Sie auch einen Verweis auf diesen Kontext.
Das ist kein Problem, wenn der Kontext nach wie vor gültig ist, aber der typische Fall beibehalten wird, um die Aktivität neu zu starten. Sehr oft für eine Bildschirmdrehung zum Beispiel. Activity Recreation wird einen neuen Kontext erstellen und alte Kontexte sollen als Garbage Collected dienen. Aber es kann jetzt nicht Müll gesammelt werden, da Ihr Fragment
immer noch einen Verweis auf den alten hat.
Das folgende Beispiel zeigt, wie es nicht zu tun
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.
}
}
Um loswerden dieses Problem zu umgehen, müssen Sie in onDestroyView
alle Verweise auf die Benutzeroberfläche löschen. Sobald die Fragment
Instanz wiederverwendet werden Sie eine neue Benutzeroberfläche auf onCreateView
erstellen gefragt. Es hat auch keinen Sinn, die Benutzeroberfläche nach onDestroyView
zu behalten. Die Ui wird nicht benutzt werden.
Das Update in diesem Beispiel gerade ist onDestroyView
zu
@Override
public void onDestroyView() {
super.onDestroyView();
mLeak = null; // now cleaning up!
}
Wechsel Und außerdem Verweise auf View
s zu halten, sollten Sie natürlich nicht Referenzen halten auf die Activity
(zB von onAttach
- sauber auf onDetach
) oder jede Context
(es sei denn, es ist der Application
Kontext).
einfach das Thema zu dokumentieren, sind hier ähnliche Themen: http://stackoverflow.com/q/11182180/693752 – Snicolas
http: // Stackoverflow. com/q/11160412/693752 – Snicolas