前言:
這幾天遇到OOM問題。
情況大概就是RecyclerView裡面跑大量的ImageView,導致崩潰。
RecyclerView我是寫在Fragment上面的,一開始我以為是因為Fragment沒有做好回收導致重複創建。
後來找到的問題,原來是網路下載圖片(ImageLoader)的方式緩存沒有做到釋放。
我更換了一下我讀取網路上圖片的的第三方,使用了Picasso發現問題就迎刃而解了!!
問了一下大家才發現如果對處理執行緒(Thread)不熟的話,不太推使用ImageLoader,它有一堆Leak的問題。
迷之聲:TMD緩存方式寫得天花亂墜的還不是一堆Leak
Android是比較推薦使用Glide和Picasso。
Glide和Picasso
使用起來其實大同小異。
在這邊大致上介紹一下使用方式:
重點程式碼:
在build.gradle(Module:app)內
Picasso
免不了的import:
免不了的import:
compile 'com.squareup.picasso:picasso:2.5.2'
使用方式:
Picasso.with(context) .load("http://i.imgur.com/DvpvklR.png") .into(imageView);
Glide
免不了的import:
免不了的import:
compile 'com.github.bumptech.glide:glide:3.7.0'
使用方式:
Glide.with(context) .load(url) .into(imageView);
兩個第三方很像吧,是不是都簡單的不要不要的!
Fresco
而Fresco是facebook自己釋出的圖片下載第三方,你自己一定體驗過facebook它們寫的app雖然用到大量的圖片,但卻不會有卡頓、Crash掉的問題,你就知道Fresco有多麼的強大了!
推薦使用:
Glide > Picasso
> Fresco > ImageLoader
當然這是比較主觀的推薦,也須依你當下的需求來使用。
如果圖片量不大,個人覺得Picasso是首選,因為他比較瘦。
當你的App內有大量的圖片需要處理,首選就會是Fresco
我擷取它人一段文章讓你參考:
Picasso所能實現的功能Glide都能做到,只是所需設置不同。兩者的區別是Picasso比Glide體積小很多且圖像質量比Glide高,但Glide的速度比Picasso更快,Glide的長處是處理大型的圖片流,如gif、video,如果要製作視頻類應用,Glide當為首選。
Fresco可以說是綜合了之前圖片加載庫的優點,其在5.0以下的內存優化非常好,但它的不足是體積太大,按體積進行比較:Fresco>Glide>Picasso,所以Fresco在圖片較多的應用中更能凸顯其價值,如果應用沒有太多圖片需求,不推薦使用Fresco。
Fresco可以說是綜合了之前圖片加載庫的優點,其在5.0以下的內存優化非常好,但它的不足是體積太大,按體積進行比較:Fresco>Glide>Picasso,所以Fresco在圖片較多的應用中更能凸顯其價值,如果應用沒有太多圖片需求,不推薦使用Fresco。
文獻:
Picasso : https://github.com/square/picasso
Glide: https://github.com/bumptech/glide
Glide超詳細介紹:https://mrfu.me/2016/02/27/Glide_Getting_Started/
Glide超詳細介紹:https://mrfu.me/2016/02/27/Glide_Getting_Started/
沒有留言:
張貼留言