基于android示例程序(bitmapfun) 高效加載圖片讓人無語地方
在android的開發(fā)指南上有這樣一篇文章,如何更有效率的加載圖片,地址為 https://developer.android.com/training/displaying-bitmaps/index.html,這篇文章詳細(xì)地介紹了如何加載高清圖到內(nèi)存,同時(shí)避免系統(tǒng)報(bào)OOM的問題,文章寫得很不錯(cuò),示例程序也可以直接運(yùn)行。在我們項(xiàng)目的一次小版本升級(jí)的過程中,我們嘗試了使用git上的一個(gè)開源項(xiàng)目afinal(bitmapfun的封裝版)來加載圖片,但是在測(cè)試的時(shí)候發(fā)現(xiàn)了一個(gè)問題,新的圖片加載器(bitmapfun)比之前用的ImageDownloader要慢很多,特別是在網(wǎng)絡(luò)狀況不好的時(shí)候,那簡(jiǎn)直是坑爹,等5s鐘算少的,一般要等10s左右,老大找到我,說這個(gè)圖片加載不出來啊,太慢了。我靠,不是吧,這玩笑開的有點(diǎn)大了吧,拿來一用,果然是慢很多。
然后開始了調(diào)試工作,開始我在想是不是網(wǎng)絡(luò)下載部分不一樣,之前用的是httpclient,現(xiàn)在bitmapfun用的是url.openConnection,果斷替換成之前的httpclient方法,感覺有所好轉(zhuǎn)(其實(shí)是自己心理在作怪),再試試,發(fā)現(xiàn)有時(shí)快,有時(shí)慢,對(duì)比之前的,之前的圖片一直很穩(wěn)定,不會(huì)出現(xiàn)這種情況啊,然后想了個(gè)辦法,在項(xiàng)目中的找了兩個(gè)頁面,一個(gè)用之前的ImageDownload加載,另一個(gè)用bitmapfun加載,然后把各個(gè)時(shí)段(可以分為3段吧,1是從內(nèi)存緩存中查找、2是從網(wǎng)絡(luò)加載、3是存到內(nèi)在緩存和sdcard緩存)的時(shí)間打印出來對(duì)比,發(fā)現(xiàn)確實(shí)是bitmapfun下載這塊(processBitmap方法)里面最耗時(shí)間,這部分的代碼,看到同步鎖,應(yīng)該是他吧,咋一看,沒問題啊,只鎖住一小塊,應(yīng)該是防止緩存沒被初始化的吧,過。。。再往下看,頻繁的對(duì)sdcard進(jìn)行io操作,恩對(duì),應(yīng)該是這里,把剛才的方法重復(fù)一下,分段打印耗時(shí),一看結(jié)果,tnnd,占用時(shí)間最長的居然是wait操作,也就是那個(gè)鎖的等待,再去看下代碼,雙擊下鎖的范圍,發(fā)現(xiàn)基本是對(duì)整個(gè)下載過程進(jìn)行了同步鎖定,這尼瑪,太坑爹了吧,一個(gè)圖片在下載的時(shí)候,其他的都得在那等著,那前面新建的3個(gè)核心線程,被你同步成一個(gè),我說怎么看到這個(gè)加載圖片這么整齊,一個(gè)個(gè)出現(xiàn)。
發(fā)現(xiàn)了問題,問下為什么,他這么做的原因是什么,其實(shí)就是為了那個(gè)DiskLruCache的日志文件,不允許多個(gè)線程同時(shí)操作,否則日志會(huì)錯(cuò)亂,就沒辦法統(tǒng)計(jì)哪個(gè)文件是最久未被使用的。自己想試著改下鎖的范圍,發(fā)現(xiàn)有點(diǎn)困難,因?yàn)橄螺d過程中對(duì)日志文件操作的太頻繁了,哪位大牛有好的方法告訴下我,不勝感激。
對(duì)使用bitmapfun或者afinal的一點(diǎn)建議,DiskLruCache慢的關(guān)鍵在于對(duì)日志文件(目錄下journal文件)的要求太高了,日志文件的作用就是記錄每一個(gè)文件的訪問次數(shù),所以它每一次讀取和寫入都要寫入日志記文件,這樣是可以更準(zhǔn)確的統(tǒng)計(jì)出最久未被使用的文件,但是代價(jià)太高了(頻繁的io操作和同步鎖),記得上個(gè)版本的bitmapfun是不用日志文件的,直接從程序訪問sdcard緩存開始計(jì)算訪問時(shí)間,其實(shí)這樣更合適一些,對(duì)性能更好。所以如果使用這個(gè)示例程序來加載圖片,最好的方式就是使用上個(gè)版本的DiskLruCache或者自己想辦法來實(shí)現(xiàn)日志文件的記錄,有更好的方法包括日志文件的記錄方法,記得告訴我哦!
附:老版本的bitmapfun,不想自己重寫文件鎖的同學(xué)可以把這里面的文件緩存移植進(jìn)去。點(diǎn)擊文件下載
- android異步加載圖片并緩存到本地實(shí)現(xiàn)方法
- Android中ListView異步加載圖片錯(cuò)位、重復(fù)、閃爍問題分析及解決方案
- Android 異步加載圖片分析總結(jié)
- Android中使用二級(jí)緩存、異步加載批量加載圖片完整案例
- Android App中使用Glide加載圖片的教程
- Android 異步加載圖片的實(shí)例代碼
- Android照片墻應(yīng)用實(shí)現(xiàn) 再多的圖片也不怕崩潰
- Android瀑布流照片墻實(shí)現(xiàn) 體驗(yàn)不規(guī)則排列的美感
- Android開發(fā)之加載圖片的方法
- Android二級(jí)緩存加載圖片實(shí)現(xiàn)照片墻功能
相關(guān)文章
kotlin 定義接口并實(shí)現(xiàn)回調(diào)的例子
這篇文章主要介紹了kotlin 定義接口并實(shí)現(xiàn)回調(diào)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果(附demo源碼下載)
這篇文章主要介紹了Android編程實(shí)現(xiàn)可滑動(dòng)的開關(guān)效果,涉及Android的布局與控件設(shè)置技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-04-04Android 實(shí)現(xiàn)旋轉(zhuǎn)木馬的音樂效果
大家一定在百度音樂上在線聽過歌,有沒有注意到那個(gè)旋轉(zhuǎn)的唱片,本篇文章主要介紹在Android上如何實(shí)現(xiàn)這樣的功能,有需要的小伙伴可以參考下2016-07-07Android studio 出現(xiàn) Unsupported major.minor version 52.0解決辦法
這篇文章主要介紹了Android studio 出現(xiàn) Unsupported major.minor version 52.0解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12Android搜索框(SearchView)的功能和用法詳解
這篇文章主要為大家詳細(xì)介紹了Android搜索框SearchView的功能和用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05解決Android Studio Log.v和Log.d不顯示的問題
這篇文章主要介紹了解決Android Studio Log.v和Log.d不顯示的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08