android - Mengapakah ulangan Gantikan Fragmen membocorkan memori?
漂亮男人
漂亮男人 2017-05-16 13:32:31
0
2
718

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

Soalan 3:

Adakah kita perlu mengelak daripada menggunakan FRAGMENT (saya tahu menggunakan HIDE/SHOW lebih baik daripada REPLACE

Terima kasih!

漂亮男人
漂亮男人

membalas semua(2)
世界只因有你

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan