從事Android開(kāi)發(fā)的同學(xué)都知道移動(dòng)設(shè)備的內(nèi)存使用是非常敏感的話題,今天我們來(lái)看下如何使用軟引用與弱引用來(lái)優(yōu)化內(nèi)存使用。下面來(lái)理解幾個(gè)概念。
1.StrongReference(強(qiáng)引用)
強(qiáng)引用是我們最最常見(jiàn)的一種,一般我們?cè)诖a中直接通過(guò)new出來(lái)的對(duì)象等,都是強(qiáng)引用,強(qiáng)引用只要存在沒(méi)有被銷毀,內(nèi)存就不會(huì)被系統(tǒng)回收。我們以生成Bitmap為例如下:
Bitmap imageBitmap = readBitmapFromResource(getResources(), R.mipmap.bg_post_activity_5);
生成Bitmap代碼:
public Bitmap readBitmapFromResource(Resources resources, int resourcesId) { BitmapFactory.Options options = new BitmapFactory.Options(); return BitmapFactory.decodeResource(resources, resourcesId, options); }
2.SoftReference(軟引用)
軟引用是用來(lái)描述一些有用但并不是必需的對(duì)象,在內(nèi)存嚴(yán)重不足的情況下會(huì)被系統(tǒng)回收,如果該對(duì)象可能會(huì)經(jīng)常使用的,就盡量用軟引用。因此,這一點(diǎn)可以很好地用來(lái)解決OOM的問(wèn)題,并且這個(gè)特性很適合用來(lái)實(shí)現(xiàn)緩存:比如網(wǎng)頁(yè)緩存、圖片緩存等。這里還是以緩存Bitmap為例:
SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(readBitmapFromResource(getResources(), R.mipmap.bg_post_activity_5)); Bitmap bitmap = softReference.get();
3.WeakReference(弱引用)
弱引用也是用來(lái)描述非必需對(duì)象的,當(dāng)JVM進(jìn)行垃圾回收時(shí),無(wú)論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象,WeakReference 的強(qiáng)度又明