Rumah > Soal Jawab > teks badan
提示说:不要把「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包含context
?Button
和TextView
之类的view就没有这种问题。
迷茫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?
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!
阿神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
怪我咯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
阿神2017-04-18 09:08:00
Kerana kitaran hayat statik adalah sangat panjang daripada aktiviti semasa
怪我咯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),