Android之圖片三級緩存

一、內(nèi)存緩存(一級)

public class MemoryCacheUtils {

存放圖片的集合

private HashMap<String,SoftReference<Bitmap>> mHashMap =new HashMap<>();

設(shè)置一級緩存(原理)

public void setMemoryCache(String url, Bitmap bitmap){

SoftReference<Bitmap> softReference=new SoftReference<Bitmap>(bitmap);

mHashMap.put(url,softReference);

mLruCache.put(url,bitmap);?

}

獲取一級緩存(原理)

public Bitmap getMemoryCache(String url){

SoftReference<Bitmap> softReference =mHashMap.get(url);

if(softReference != null){

Bitmap bitmap =softReference.get();

return bitmap;

}

return null;

return mLruCache.get(url);

}

}

優(yōu)化:使用LruCache算法(least recentlly used cache)熄阻,告別軟引用和弱引用,內(nèi)部核心是通過算法實現(xiàn)緩存的大小控制佳窑,封裝HashMap,使用更加方便簡單。使用LruCache代替上述的HashMap漾肮。

private LruCache<String,Bitmap> mLruCache;

構(gòu)造方法初始化LruCache

public MemoryCacheUtils(){

//獲取虛擬機分配的最大內(nèi)存,默認16M

?long maxMemory = Runtime.getRuntime().maxMemory();

//參數(shù)是內(nèi)存緩存上限

mLruCache =new LruCache((int) (maxMemory/8)){

@Override

?protected int sizeOf(String key, Bitmap value) {

//獲取單個對象占用字節(jié)數(shù)大小

//int byteCount = value.getByteCount();

//兼容低版本,一行字節(jié)數(shù)*總行數(shù)

??int byteCount =value.getRowBytes()*value.getHeight();

//返回單個對象占用內(nèi)存大小

?return byteCount;

}

};


二谤狡、本地緩存(二級)

public class LocalCacheUtils {

需要存放本地緩存的目錄路徑

String path = Environment.getExternalStorageDirectory().getAbsolutePath() +"/自定義/";

設(shè)置本地緩存

public void setLocalCache(String url, Bitmap bitmap) {

File dir =new File(path);

if (!dir.exists() || !dir.isDirectory()) { ?// 不存在 或者 不是目錄

//創(chuàng)建此抽象路徑名指定的目錄?//dir.mkdir();

//創(chuàng)建此抽象路徑名指定的目錄灸眼,包括所有必需但不存在的父目錄。

?dir.mkdirs();

}

//url需要經(jīng)過處理

??File file =new File(dir, url);

//將圖片壓縮到本地

?try {

//參數(shù)1是圖片格式墓懂,參數(shù)2是壓縮比(0-100)焰宣,100代表不壓縮,參數(shù)3是文件輸出流 ? bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file));

}catch (FileNotFoundException e) {

e.printStackTrace();

}

}

獲取本地緩存

public Bitmap getLocalCache(String url) {

//url需要經(jīng)過處理

??try {

File cacheFile =new File(path, url);

if (cacheFile.exists()) { ?//緩存存在

?Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(cacheFile));

return bitmap;

}

}catch (Exception e) {

e.printStackTrace();

}

return null;

}

}


三、網(wǎng)絡(luò)緩存(三級)

public class NetCacheUtils {

private LocalCacheUtils mLocalCacheUtils;

private MemoryCacheUtils mMemoryCacheUtils;

public NetCacheUtils(MemoryCacheUtils memoryCacheUtils,LocalCacheUtils localCacheUtils) {

mMemoryCacheUtils=memoryCacheUtils;

mLocalCacheUtils=localCacheUtils;

}

獲取網(wǎng)絡(luò)圖片

public void getBitmapFromNet(ImageView imageView,String url){

?new BitmapTask().execute(imageView,url);

}

異步加載網(wǎng)絡(luò)圖片的內(nèi)部類

class BitmapTaskextends AsyncTask<Object,Void,Bitmap>{

private ImageView mImageView;

@Override

protected void onPreExecute() { //預(yù)操作

super.onPreExecute();

}

@Override

protected Bitmap doInBackground(Object... params) {//耗時操作

//根據(jù)異步加載時傳入的參數(shù)順序來獲取參數(shù)

mImageView = (ImageView) params[0];

String url = (String) params[1];

//防止網(wǎng)絡(luò)慢時捕仔,控件與加載的圖片顯示不符(ListView)

mImageView.setTag(url);

//網(wǎng)絡(luò)訪問

download(url);

return null;

}

@Override

protected void onPostExecute(Bitmap bitmap) { ?//后續(xù)操作

doInBackground返回的值作為參數(shù)傳入本方法

?if(bitmap!=null){

mImageView.setImageBitmap(bitmap);

String url= (String)mImageView.getTag();

寫入本地緩存

mLocalCacheUtils.setLocalCache(url,bitmap);

寫入內(nèi)存緩存

?mMemoryCacheUtils.setMemoryCache(url,bitmap);

}

}

}

}


四匕积、三級緩存綜合使用

public class BitmapUtils {

private NetCacheUtils mNetCacheUtils;

private LocalCacheUtils mLocalCacheUtils;

private MemoryCacheUtils mMemoryCacheUtils;

public BitmapUtils(){

mMemoryCacheUtils =new MemoryCacheUtils();

mLocalCacheUtils =new LocalCacheUtils();

mNetCacheUtils =new NetCacheUtils(mMemoryCacheUtils,mLocalCacheUtils);

}

通過優(yōu)先級加載圖片

public void displayBitmap(ImageView imageView,String url){

內(nèi)存緩存

Bitmap bitmap=mMemoryCacheUtils.getMemoryCache(url);

if(bitmap!=null){

imageView.setImageBitmap(bitmap);

return;

}

本地緩存

Bitmap bitmap1=mLocalCacheUtils.getLocalCache(url);

if(bitmap1!=null){

imageView.setImageBitmap(bitmap1);

mMemoryCacheUtils.setMemoryCache(url,bitmap1);

return;

}

網(wǎng)絡(luò)緩存

mNetCacheUtils.getBitmapFromNet(imageView,url);

}

}


五、Android之四大引用

簡介:Java虛擬機存在棧和堆榜跌,棧存放變量闪唆,堆存放類,它們之間存在一種引用關(guān)系

1钓葫、強引用:默認都是強引用悄蕾,不會回收

2、軟引用:當內(nèi)存不足時础浮,垃圾回收器會考慮回收

創(chuàng)建:SoftReference<Bitmap>?softReference=new SoftReference<Bitmap>(bitmap);

從軟引用中取出:Bitmap bitmap =softReference.get();

3帆调、弱引用:當內(nèi)存不足時,垃圾回收器更會考慮回收豆同,

4番刊、虛引用:當內(nèi)存不足時,垃圾回收器最先考慮回收

5影锈、垃圾:一些沒有被引用的對象稱之為垃圾

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芹务,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子精居,更是在濱河造成了極大的恐慌锄禽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靴姿,死亡現(xiàn)場離奇詭異沃但,居然都是意外死亡,警方通過查閱死者的電腦和手機佛吓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門宵晚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垂攘,“玉大人,你說我怎么就攤上這事淤刃∩顾” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵逸贾,是天一觀的道長陨仅。 經(jīng)常有香客問我,道長铝侵,這世上最難降的妖魔是什么灼伤? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮咪鲜,結(jié)果婚禮上狐赡,老公的妹妹穿的比我還像新娘。我一直安慰自己疟丙,他們只是感情好颖侄,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著享郊,像睡著了一般览祖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拂蝎,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天穴墅,我揣著相機與錄音惶室,去河邊找鬼温自。 笑死,一個胖子當著我的面吹牛皇钞,可吹牛的內(nèi)容都是我干的悼泌。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼夹界,長吁一口氣:“原來是場噩夢啊……” “哼馆里!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起可柿,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鸠踪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后复斥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體营密,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年目锭,在試婚紗的時候發(fā)現(xiàn)自己被綠了评汰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纷捞。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖被去,靈堂內(nèi)的尸體忽然破棺而出主儡,到底是詐尸還是另有隱情,我是刑警寧澤惨缆,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布糜值,位于F島的核電站,受9級特大地震影響坯墨,放射性物質(zhì)發(fā)生泄漏臀玄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一畅蹂、第九天 我趴在偏房一處隱蔽的房頂上張望健无。 院中可真熱鬧,春花似錦液斜、人聲如沸累贤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼膏。三九已至,卻和暖如春示损,著一層夾襖步出監(jiān)牢的瞬間渗磅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工检访, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留始鱼,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓脆贵,卻偏偏與公主長得像医清,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卖氨,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一会烙、緩存介紹: (一)、Android中緩存的必要性: 智能手機的緩存管理應(yīng)用非常的普遍和需要筒捺,是提高用戶體驗的有...
    溫暖的外星閱讀 890評論 0 12
  • 一盞燈柏腻, 一片昏黃; 一簡書系吭, 一杯淡茶五嫂。 守著那一份淡定, 品讀屬于自己的寂寞村斟。 保持淡定贫导, 才能欣賞到最美麗的...
    這個碼農(nóng)不太牛閱讀 697評論 0 14
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理抛猫,服務(wù)發(fā)現(xiàn),斷路器孩灯,智...
    卡卡羅2017閱讀 134,713評論 18 139
  • 圖片的三級緩存機制一般是指應(yīng)用加載圖片的時候闺金,分別去訪問內(nèi)存,文件和網(wǎng)絡(luò)而獲取圖片數(shù)據(jù)的一種行為峰档。以下內(nèi)容只是簡單...
    笑說余生閱讀 9,726評論 5 59
  • 展示一下 我們就這樣 民工哦哦紅
    hoopboy閱讀 386評論 0 0