java软引用在android中有实际应用场景吗?
ringa_lee
ringa_lee 2017-04-17 17:57:53
0
3
1211

前端时间看见java四种引用的介绍,
觉得软引用看起来可以用作内存优化.

然后看博客说,LRU内部是维护了一个有强引用的LinkedHashMap,他会根据算法将最靠前的资源从集合中移除.并没有使用到软引用.

所以请问一下,java的软引用或者弱引用在android中有应用场景吗?

LRU这样的做法,除了让缓存更大可能被复用到,还有其他优势吗?


20:56 增加

看到一篇博客说android2.3(api9)开始,内存回收器即使在内存充足的情况下,软引用和弱引用指向的对象依然有可能被回收.

那么这样的话利用弱引用来创建的Handler用于防止Handler内存泄露的方案是不是很不可靠?

//代码引用自博客
public class TestReferenceActivity extends BaseActivity {  
    static class MyHandler extends Handler {  
        private WeakReference<TestReferenceActivity> reference;  
  
        public MyHandler(Activity activity) {  
            //使用弱引用包裹当前的activity  
            reference = new WeakReference(activity);  
        }  
    }  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_test_reference);  
  
        //解决Handler可能造成的内存泄露  
        //通过弱引用实现,如果当前activity需要被回收了,而且Handle持有的
        //activity是被弱引用包装的,则垃圾回收器可以释放掉此activity。  
        MyHandler myHandler = new MyHandler(this);  
    }  
}  
ringa_lee
ringa_lee

ringa_lee

membalas semua(3)
黄舟

Rujukan lembut sememangnya terhad dalam fungsi asalnya selepas sistem 2.3, tetapi ia masih boleh digunakan, tetapi ia tidak dikitar semula dengan mudah semasa GC pada Android seperti pada JVM asli. Untuk kegunaan khusus, saya mengesyorkan artikel ini kepada anda

黄舟

Rujukan lembut dan rujukan lemah bukan tidak boleh digunakan, tetapi kelakuannya tidak dapat diramalkan.
Kami tidak dapat mengetahui dengan tepat bila sumber rujukan yang lemah akan dikitar semula Dalam situasi caching imej biasa, algoritma LRU adalah lebih cekap daripada rujukan yang lemah dan boleh mengelakkan berbilang penciptaan/kitar semula sumber dengan berkesan.
Rujukan yang lemah lebih sesuai untuk situasi tertentu di mana kebocoran ingatan mudah berlaku Contohnya, dalam AsyncTask, kita boleh menggunakan rujukan yang lemah untuk mengelakkan kebocoran memori.

刘奇

Rujukan lembut sebenarnya sangat berguna dalam pembangunan sebenar Android, seperti pemuatan tak segerak imej Yang paling tipikal ialah imageloder juga menggunakan rujukan lembut semasa berurusan dengan pengoptimuman cache. Selain itu, rujukan lembut memberi saya perasaan itu ia tidak berkesan dalam pengoptimuman prestasi Ia tidak boleh membantu terutamanya untuk oom. Jika terdapat keperluan untuk pengoptimuman prestasi, ia sebenarnya disyorkan untuk menggunakan rujukan yang lemah

Selepas menjawab, saya melihat bahawa masih terdapat soalan di bawah soalan sebenarnya, sebab rujukan lembut digunakan untuk menghalang pengendali daripada OOM adalah disebabkan oleh mekanisme khas Android apabila utas utama Android dibuat , akan ada satu lagi pada masa yang sama Objek Looper akan melaksanakan MessageQueue Apabila kita mencipta objek pengendali, setiap kali kita menggunakan pengendali untuk meletakkan mesej ke dalam MessageQueue eue, mesej ini akan menyimpan rujukan kepada objek pengendali Oleh itu, apabila Aktiviti ditamatkan dan sebelum mesej dikeluarkan, mesej akan sentiasa wujud, dan mesej akan memegang rujukan kepada pengendali aktiviti dan akan berterusan Terdapat rujukan kepada aktiviti, jadi aktiviti ini tidak boleh dikitar semula oleh gc, dan oom akan berlaku. Semua objek bukan statik dalam Java akan memegang rujukan yang kuat kepada objek semasa, manakala objek statik hanya memegang rujukan lemah kepada kelas semasa Ini menyelesaikan masalah apabila aktiviti ditamatkan, mesej tidak dapat diproses, menyebabkan mesej kekal pegang pengendali, pengendali memegang rujukan aktiviti secara kekal.

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