圖片優(yōu)化
- 及時解綁ImageView等和Bitmap的綁定里伯,也就是某個ImageView不再顯示了城瞎,就setImageBitmap(null),使得Bitmap的內(nèi)存對象能及時回收疾瓮,減少內(nèi)存占用脖镀。
- 調(diào)用Bitmap的recycle方法,該方法標(biāo)記此內(nèi)存(本地堆內(nèi)存)可以被回收了狼电。
- 在加載圖片時蜒灰,如果可能的話,捕獲OutOfMemory異常肩碟,并做相應(yīng)的處理(如:顯示默認(rèn)圖片)强窖,而不是直接崩潰。
使用BitmapFactory.Options優(yōu)化
- 加載比原圖片縮略圖削祈,或者加載適合View大小的圖
- 解碼時毕骡,使用Bitmap.Config降低圖片質(zhì)量
- decodeStream直接調(diào)用 JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap岩瘦,也不使用java空間進(jìn)行分辨率適配未巫,雖節(jié)省dalvik內(nèi)存,但需要在hdpi和mdpi启昧,ldpi中配置相應(yīng)的 圖片資源叙凡,否則在不同分辨率機(jī)器上都是同樣大小(像素點(diǎn)數(shù)量)密末。其他方法如setImageBitmap握爷、setImageResource、 BitmapFactory.decodeResource在完成decode后严里,最終都是通過java層的 createBitmap來完成的新啼,需要消耗更多內(nèi)存。
使用LruCache緩存圖片
lru全稱為Least Recently Used刹碾,最近最少使用燥撞。
該類指定一個最大內(nèi)存,如果其中保存的對象超過最大內(nèi)存,則移除最近使用的對象物舒。
該類是線程安全的色洞,在重寫該類的方法時,為了保證線程安全冠胯,需要做一些同步工作火诸。該類,內(nèi)部使用的同步對象為this荠察。
擴(kuò)展LruCache
public LruCache (int maxSize)
// 不需要重寫置蜀。
// Runtime.getRuntime().maxMemory()方法獲取的是可用內(nèi)存的值
// maxSize參數(shù)的值可以根據(jù)實(shí)際情況參考上面的值來計(jì)算
protected V create (K key)
// 創(chuàng)建key對應(yīng)的對象
protected void entryRemoved (boolean evicted, K key, V oldValue, V newValue)
// 當(dāng)key對應(yīng)的對象被移除時,掉喲個該方法悉盆。
// 此時應(yīng)該釋放所占用的內(nèi)存盾碗。
protected int sizeOf (K key, V value)
// 返回指定對象所占用的內(nèi)存空間
DiskLruCache
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
由于DiskLruCache的構(gòu)造方法是私有的,所以必須調(diào)用該方法來獲取實(shí)例舀瓢。
- directory參數(shù):存儲的目錄
- appVersion參數(shù):該應(yīng)用程序的版本,如果當(dāng)前版本和緩存時的版本不同耗美,則緩存被刪除
- valueCount:表示同一個key對應(yīng)多少個緩存文件
- maxSize:可以緩存的最大字節(jié)數(shù)
public Editor edit(String key)
調(diào)用該方法寫入緩存京髓。基本流程為:
- 首先應(yīng)該在一個異步任務(wù)中執(zhí)行該流程商架。
- 根據(jù)URL計(jì)算出key值堰怨,可以獲取它的摘要作為key。
- 調(diào)用上面的方法
- 從網(wǎng)絡(luò)下載
- 如果下載成功蛇摸,調(diào)用Editor的commit方法
- 如果下載失敗备图,調(diào)用Editor的abort方法
public synchronized Snapshot get(String key)
調(diào)用該方法得到緩存。
- 首先應(yīng)該在一個異步任務(wù)中執(zhí)行該流程赶袄。
- 調(diào)用上面的方法
- 如果返回null揽涮,表示沒有緩存,則從網(wǎng)絡(luò)下載饿肺,并存入緩存蒋困,并返回對象
- 如果不為null,直接返回
其他方法
public static String readFully(Reader reader)
public static String readAsciiLine(InputStream in)
public static void closeQuietly(Closeable closeable)
public static void deleteContents(File dir)
public File getDirectory()
public synchronized long size()
// 返回當(dāng)前大小
public long maxSize()
public synchronized boolean remove(String key)
public void delete()
// 關(guān)閉敬辣,并刪除該目錄下的所有文件
public synchronized void close()
public boolean isClosed()
public synchronized void flush()
// 把操作同步到日志文件中
// Snapshot類
public Editor edit()
public InputStream getInputStream(int index)
public String getString(int index)
public void close()
// Editor類
public InputStream newInputStream(int index)
public OutputStream newOutputStream(int index)
public String getString(int index)
public void set(int index, String value)
public void commit()
public void abort()
參考
http://blog.csdn.net/guolin_blog/article/details/28863651
http://blog.csdn.net/guolin_blog/article/details/34093441
http://blog.csdn.net/guolin_blog/article/details/28863651