Rumah  >  Soal Jawab  >  teks badan

android - 为什么定义一个static ImageView会导致内存泄露?

提示说:不要把「Do not place android context classes in static fields, this is a memory leak.」

我知道activity context 不应该被放到static fields里面因为它在app生命周期内一直存在,而且如果它通过构造函数传递给其他class的话,其他class也会一直不被回收。

但为什么ImageView不能是static(我发现SwipeRefreshLayout也不行)?是因为ImageView包含contextButtonTextView之类的view就没有这种问题。

PHPzPHPz2765 hari yang lalu725

membalas semua(7)saya akan balas

  • 迷茫

    迷茫2017-04-18 09:08:00

    Untuk mengisi reka letak dalam Aktiviti, anda boleh melakukan perkara berikut:

    1.view view = View.inflate(context, R.layout.test,null );
    2.View view = LayoutInflater.from(context).inflate(R.layout.test,null);
    

    Ia boleh didapati bahawa tidak kira kaedah yang digunakan, Paparan yang diisi memegang rujukan kepada konteks, yang merupakan rujukan kepada Aktiviti
    Jika paparan yang diisi pada masa ini diubah suai secara statik, maka statik objek akan terus berterusan Kerana terdapat rujukan kepada Aktiviti, Aktiviti tidak boleh dimusnahkan dan semua kawalan dalam Aktiviti tidak akan dimusnahkan dan dikitar semula sepenuhnya, akhirnya menyebabkan kebocoran memori.

    PS: Mengapa menggunakan Paparan statik Adakah terdapat sebarang keperluan perniagaan khas?

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:08:00

    Pembolehubah statik wujud secara berasingan dalam blok memori Kawalan (ImageView dalam soalan anda) memegang rujukan kepada Aktiviti Dalam kes ini, Aktiviti tidak boleh dimusnahkan sepenuhnya kerana sentiasa ada rujukan (pemahaman penunjuk) dalam ingatan. jadi Aktiviti tidak boleh dikitar semula, dan secara semula jadi akan berlaku kebocoran memori!
    Adalah disyorkan untuk tidak menggunakan kawalan diubah suai statik dalam Android!

    balas
    0
  • 阿神

    阿神2017-04-18 09:08:00

    Paparan perlu memegang Konteks (jika tidak, fungsi kelas setXXX(int resid) tidak dapat direalisasikan)

    Saya tidak tahu mengapa Button/TextView tidak memberi amaran

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 09:08:00

    Pembolehubah statik tidak boleh dikitar semula secara automatik
    Anda menetapkan paparan sebagai pembolehubah statik, dan paparan itu memegang rujukan kepada aktiviti tersebut malah kini telah bocor

    balas
    0
  • 迷茫

    迷茫2017-04-18 09:08:00

    IPC berkata: statik adalah pembunuh bagi empat komponen utama Android

    balas
    0
  • 阿神

    阿神2017-04-18 09:08:00

    Kerana kitaran hayat statik adalah sangat panjang daripada aktiviti semasa

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 09:08:00

    Katakan begini, ini adalah asas Java Selepas fail kelas disusun menjadi bytecode, pembolehubah statik akan dimulakan apabila kawasan kaedah dimuatkan, dan pembolehubah statik akan sentiasa wujud, tanpa diubah suai statik. aktiviti , akan memohon ruang dalam timbunan apabila baru, apabila ac Apabila tivity tidak digunakan, gc akan merentasi aktiviti mengikut gc-root untuk melihat sama ada ia dirujuk Memandangkan context aktiviti itu diadakan, ImageView view = LayoutInflater.from(context).inflate(R.layout.test,null);, oleh itu, gc tidak boleh mengitar semula, menyebabkan kebocoran memori sehingga. mesin maya tamat Proses (iaitu apl dihentikan),

    balas
    0
  • Batalbalas