Heim > Fragen und Antworten > Hauptteil
Wie im Bild gezeigt, wenn auf die beiden Schaltflächen unten geklickt wird, REPALCEEs gibt oben zwei Fragmente, und beim wiederholten Wechseln ist ein Speicherverlust aufgetreten
Dies ist der Code für das 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();
}
}
Dies ist Teil des Aktivitätskodex
@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();
}
Dies ist der Speicherstatus beim wiederholten Umschalten:
Das ist LOGCAT. Sie können sehen, dass onDestroy ausgeführt wird und der gesamte Fragment-Lebenszyklus sofort beendet ist
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
Warum ist die Erinnerung, die er innehatte, immer noch da?
Frage 2:
Wie ordne ich in JAVA eine bestimmte Menge Speicher für Experimente zu?
Sollten wir die Verwendung von FRAGMENT vermeiden (ich weiß, dass die Verwendung von HIDE/SHOW besser ist als REPLACE
).
世界只因有你2017-05-16 13:34:31
把LeakCanary集成到代码里面,看看是什么原因导致的内存泄露。
而且内存图上升,也不一定就是内存泄露。你每次申请了Bitmap,没准没达到GC的标准,那内存一直上涨也没问题。