自己設(shè)計(jì)實(shí)現(xiàn)圖片加載器

這里不貼大段的代碼了荔泳,單單列出思路,和一些解決思路虐杯。

我們的圖片加載過(guò)程玛歌,可以引入緩存,我們?cè)O(shè)計(jì)一種兩層緩存的架構(gòu)擎椰,當(dāng)拿到一個(gè)需要加載的圖片的url時(shí)支子,我們先從內(nèi)存緩存中根據(jù)url查找看內(nèi)存緩存有沒(méi)有相關(guān)緩存,如果沒(méi)有达舒,那么我們?cè)诖疟P(pán)緩存中進(jìn)行查找值朋,如果磁盤(pán)緩存也沒(méi)有,那么我們需要發(fā)出真正的網(wǎng)絡(luò)請(qǐng)求巩搏,進(jìn)行圖片的加載昨登,當(dāng)圖片網(wǎng)絡(luò)加載成功時(shí)將圖片存入兩級(jí)緩存。
內(nèi)存緩存的實(shí)現(xiàn)贯底,可以借助LruCache篙骡,大小可以指定為app可用內(nèi)存的8分之一。
磁盤(pán)緩存可以借助DiskLruCache,也可以自己在app的緩存目錄下進(jìn)行文件io糯俗,注意由于文件Io比較慢尿褪,因此存和取最好都要開(kāi)啟新的異步任務(wù)。另外如果自己進(jìn)行實(shí)現(xiàn)得湘,可以考慮對(duì)url進(jìn)行MD5運(yùn)算杖玲,將文件名取為hash值,同時(shí)使用app緩存文件時(shí)淘正,最好自己在建一個(gè)子目錄摆马。另外app內(nèi)部可以有一個(gè)菜單展示當(dāng)前磁盤(pán)緩存大小,方便進(jìn)行清理鸿吆。
網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)囤采,最基本的要通過(guò)異步任務(wù)來(lái)獲取圖片。

加載圖片的優(yōu)化問(wèn)題惩淳。
圖片是各式各樣的蕉毯,大多數(shù)情況下,我們要展示的圖片思犁,比原始圖片小很多代虾。比如用戶頭像控件只有6464,如果用戶的頭像的原始文件有512512,那么即使我們加載了原始圖片,然而肉眼也看不出區(qū)別缤剧。因此,我們加載圖片的時(shí)候乘瓤,可以先獲取即將加載的圖片的大小,格式等策泣,然后根據(jù)需要的尺寸衙傀,加載重新采樣的版本。這一個(gè)過(guò)程着降,對(duì)于網(wǎng)絡(luò)加載同樣適用差油。BitmapFactory的decodeStream可以從網(wǎng)絡(luò)輸入流加載圖片拗军。不過(guò)如果我們先測(cè)量任洞,后加載,可能會(huì)爆io異常发侵,這是由于同一個(gè)輸入流被讀取了兩次交掏。根據(jù)api,第一次測(cè)量的時(shí)候刃鳄,輸入流的讀取位置被改變了盅弛,如果需要再次讀取,需要先復(fù)位。然而我測(cè)試發(fā)現(xiàn)挪鹏,即使復(fù)位见秽,也有可能報(bào)異常,因此參考了網(wǎng)絡(luò)的其它回答讨盒。我們可以將輸入流數(shù)據(jù)寫(xiě)入字節(jié)數(shù)組輸出流中解取,然后就可以多次對(duì)流進(jìn)行操作了。

網(wǎng)絡(luò)請(qǐng)求的發(fā)出優(yōu)化
當(dāng)需要加載大量圖片時(shí)返顺,可能會(huì)有這樣的場(chǎng)景禀苦,即當(dāng)前頁(yè)面的圖片還沒(méi)有加載出來(lái),我們已經(jīng)滑動(dòng)到了其它頁(yè)面遂鹊,或者下一頁(yè)振乏,這導(dǎo)致發(fā)出的網(wǎng)絡(luò)請(qǐng)求越來(lái)越多,而用戶目前正在查看的內(nèi)容的網(wǎng)絡(luò)請(qǐng)求無(wú)法最快完成秉扑。比如在一個(gè)展示圖片的app中慧邮,上拉會(huì)加載更多圖片。如果在當(dāng)前頁(yè)的圖片未完全展示的情況下邻储,用戶進(jìn)行了多次上拉操作赋咽,那么即使一開(kāi)始的頁(yè)面的圖片已經(jīng)沒(méi)用了,后臺(tái)的網(wǎng)絡(luò)請(qǐng)求還是回去先加載它們吨娜,從而使得當(dāng)前用戶停留頁(yè)面的圖片得不到即使加載脓匿。
我在實(shí)現(xiàn)中曾引入一個(gè)簡(jiǎn)單的設(shè)計(jì),一個(gè)存儲(chǔ)異步任務(wù)的數(shù)組宦赠,發(fā)出任務(wù)時(shí)陪毡,加入數(shù)組,如果超過(guò)一定的閾值勾扭,那么就取消最先加入的任務(wù)毡琉,而添加新的任務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妙色,一起剝皮案震驚了整個(gè)濱河市桅滋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身辨,老刑警劉巖丐谋,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異煌珊,居然都是意外死亡号俐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)定庵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吏饿,“玉大人踪危,你說(shuō)我怎么就攤上這事≈砺洌” “怎么了贞远?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)笨忌。 經(jīng)常有香客問(wèn)我兴革,道長(zhǎng),這世上最難降的妖魔是什么蜜唾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任杂曲,我火速辦了婚禮,結(jié)果婚禮上袁余,老公的妹妹穿的比我還像新娘擎勘。我一直安慰自己,他們只是感情好颖榜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布棚饵。 她就那樣靜靜地躺著,像睡著了一般掩完。 火紅的嫁衣襯著肌膚如雪噪漾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天且蓬,我揣著相機(jī)與錄音欣硼,去河邊找鬼。 笑死恶阴,一個(gè)胖子當(dāng)著我的面吹牛诈胜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冯事,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼焦匈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了昵仅?” 一聲冷哼從身側(cè)響起缓熟,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摔笤,沒(méi)想到半個(gè)月后够滑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡籍茧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年版述,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梯澜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞冯。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渴析,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吮龄,到底是詐尸還是另有隱情俭茧,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布漓帚,位于F島的核電站母债,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尝抖。R本人自食惡果不足惜毡们,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昧辽。 院中可真熱鬧衙熔,春花似錦、人聲如沸搅荞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咕痛。三九已至痢甘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茉贡,已是汗流浹背塞栅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腔丧,地道東北人构蹬。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悔据,于是被迫代替她去往敵國(guó)和親庄敛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,519評(píng)論 25 707
  • 本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布,來(lái)源于我在CSDN發(fā)表的一篇博文:http:/...
    半島鐵盒里的貓閱讀 1,176評(píng)論 0 4
  • 本文會(huì)從工作原理到具體實(shí)現(xiàn)來(lái)詳細(xì)介紹如何開(kāi)發(fā)一個(gè)簡(jiǎn)潔而實(shí)用的Android圖片加載框架科汗,并從內(nèi)存占用與加載圖片所需...
    absfree閱讀 2,384評(píng)論 4 34
  • 0. 前言 前面有被用戶投訴 APP 流量消耗厲害: 于是乎考慮了流量方面的問(wèn)題藻烤。暫時(shí) APP 中涉及流量的幾個(gè)方...
    zyl06閱讀 23,923評(píng)論 5 62
  • 昨夜一雪顧楓林, 瀟瀟落葉盡歸根头滔。 若不知身裹寒意怖亭, 意為梅花渡滿地。 尋覓 尋覓坤检, 未經(jīng)頑童嬉戲兴猩, 翌日不尋影。
    付肖飛閱讀 532評(píng)論 0 1