最近負(fù)責(zé)帶領(lǐng)公司項(xiàng)目重構(gòu)太援,重構(gòu)的時(shí)候發(fā)現(xiàn)項(xiàng)目里面同時(shí)在使用兩個(gè)圖片加載框架全跨,andriod-universal-image-loader和fresco,這兩個(gè)框架其實(shí)都挺好的惶室,不過項(xiàng)目里面不能同時(shí)使用兩個(gè)框架神年。因?yàn)樗麄兂跏蓟瓦\(yùn)行的時(shí)候都需要分配一定的內(nèi)存,這樣會(huì)導(dǎo)致緩存圖片的內(nèi)存變大淆攻,如果不知情分配過大肮之,還有可能導(dǎo)致隱形的oom。
問了以前的老員工都說不知道具體原因卜录,說是歷史遺留問題。
最后一個(gè)老員工說眶明,一個(gè)類似發(fā)朋友圈功能的地方艰毒,如果用戶選擇了多張圖片待發(fā)送,這個(gè)時(shí)候用戶又點(diǎn)擊刪除某張圖片搜囱,這個(gè)時(shí)候剩下的圖片列表就會(huì)出現(xiàn)閃爍問題丑瞧,說用fresco解決不了,用imageloader就不會(huì)出現(xiàn)閃爍的問題蜀肘。暈绊汹,總不能因?yàn)橐鉀Q一個(gè)問題引入一個(gè)700kb的第三方框架吧!
fresco是facebook出品扮宠,在穩(wěn)定性和調(diào)用簡易性方面還是值得信賴的西乖。andriod-universal-image-loader比較大,并且好像很長時(shí)間也不怎么維護(hù)和更新了坛增。最后決定使用fresco框架获雕。
使用fresco那么就面對(duì)自己解決加載圖片閃爍的問題,其實(shí)所有圖片框架原理都大同小異收捣,首先去memory里面加載届案,沒有找到就是去本地緩存sdcard里面查找加載,如果還沒有罢艾,那么沒辦法只能使用網(wǎng)絡(luò)從圖片服務(wù)器加載了楣颠。
回歸正題,導(dǎo)致刪除圖片閃躲的原因是什么呢咐蚯?
刪除一張圖片后童漩,需要對(duì)圖片列表進(jìn)行刷新操作,這個(gè)時(shí)候需要重新從sdcard里面讀取圖片仓蛆,這么問題就來了睁冬,因?yàn)楝F(xiàn)在的手機(jī)照相機(jī)像素都非常高,好多都是4000*2500的,你可以測試一下BitmapFactory.decodeFile()從sdcard加載一張這樣大小的圖片需要300多ms豆拨,如果加上旋轉(zhuǎn)變換直奋,那么至少需要1500多ms。你想肯定會(huì)出現(xiàn)卡頓閃爍的問題了施禾。
知道導(dǎo)致原因脚线,那么如何解決?
1弥搞、必須對(duì)Bitmap做縮略圖處理邮绿。
2、對(duì)于已經(jīng)加載過的進(jìn)行memory緩存處理攀例。
廢話不多說船逮,直接上代碼吧!
第一步:
創(chuàng)建一個(gè)hashmap保存bitmap對(duì)象粤铭,千萬記得bitmap要用弱引用挖胃,防止加載過多導(dǎo)致oom。
第二步:
從map中直接取出bitmap梆惯,如果不為空就直接顯示酱鸭,為空就從sdcard中加載。
第三步:
記得開啟開啟多線程加載垛吗,本地看似挺快凹髓,圖片多了也會(huì)anr,也會(huì)卡頓怯屉。用戶體驗(yàn)不好蔚舀。
第四步
這里面有兩個(gè)比較關(guān)鍵的技術(shù)點(diǎn)。
1锨络、加載bitmap的時(shí)候蝗敢,對(duì)圖片進(jìn)行壓縮。
2足删、對(duì)于三星手機(jī)拍照后圖片旋轉(zhuǎn)問題寿谴,如何對(duì)圖片進(jìn)行旋轉(zhuǎn)處理。
以上就是解決問題的所有代碼失受,總共加起來不到100行讶泰,問題都解決了,最主要用這不到100行代碼拂到,替換了一個(gè)700kb左右的圖片加載框架痪署,這個(gè)才是解決問題的最大收益。
現(xiàn)在的程序員有一個(gè)通病就是都是喜歡拿來主義兄旬,啥都喜歡用第三方的狼犯,別人現(xiàn)成的余寥,導(dǎo)致現(xiàn)在好多公司的項(xiàng)目引入大量的第三方庫,有很多僅僅用了不到千分之一的功能悯森,你說何必呢宋舷?自己分析下,幾行代碼往往就可以解決了瓢姻。
最后送給所有的it朋友一句話祝蝠,希望引起你們的共勉。
所有復(fù)雜問題要簡單化幻碱,所有簡單問題還是要簡單化绎狭。