Seperti yang ditunjukkan dalam gambar, apabila dua butang di bawah diklik, REPALCETerdapat dua Fragmnet di atas, dan kebocoran memori berlaku apabila bertukar berulang kali
Ini ialah kod untuk Fragmen:
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();
}
}
Ini adalah sebahagian daripada kod Aktiviti
@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();
}
Ini ialah status ingatan apabila bertukar berulang kali:
Ini ialah LOGCAT Anda dapat melihat bahawa onDestroy dilaksanakan dan keseluruhan kitaran hayat Fragment tamat serta-merta
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
Jadi kenapa ingatan yang dia duduki masih ada?
Soalan 2:
Bagaimana untuk memperuntukkan sejumlah memori dalam JAVA untuk eksperimen kaedah bitmap saya, dan terdapat KONTEKS di dalamnya
Adakah kita perlu mengelak daripada menggunakan FRAGMENT (saya tahu menggunakan HIDE/SHOW lebih baik daripada REPLACE
Sepadukan LeakCanary ke dalam kod untuk melihat apa yang menyebabkan kebocoran memori.
Dan jika graf memori meningkat, ia tidak semestinya bermakna kebocoran memori. Setiap kali anda memohon Bitmap, ia mungkin tidak memenuhi piawaian GC, jadi tiada masalah jika ingatan terus meningkat.
Ini bukan masalah serpihan, ia adalah peta bit yang anda gunakan