如Fresco 中文官網(wǎng)所述,F(xiàn)resco是專(zhuān)為Android加載圖片的框架咆瘟,但是使用不當(dāng)也會(huì)遇到很多坑,下面根據(jù)自己親身踩坑的經(jīng)歷談?wù)?Android中使用fresco加載大量圖片出現(xiàn)的OOM問(wèn)題诽里。
關(guān)于Fresco的簡(jiǎn)單使用如下袒餐,下面的博客介紹的非常詳細(xì)了,可以仔細(xì)閱讀一下谤狡。
此處我就直接了當(dāng)簡(jiǎn)單介紹Fresco加載圖片使用步驟及遇到OOM的應(yīng)對(duì)策略灸眼。
本人使用Fresco加載圖片列表發(fā)生OOM解決思路:
首先分頁(yè)加載
1,加載圖片高清墓懂,圖片太大焰宣。方法:初始化時(shí)對(duì)圖片進(jìn)行壓縮, 和ImageRequest的ResizeOptions一起使用捕仔,作用就是在圖片解碼時(shí)根據(jù)ResizeOptions所設(shè)的寬高的像素進(jìn)行解碼匕积,這樣解碼出來(lái)可以得到一個(gè)更小的Bitmap。
.setDownsampleEnabled(true)
.setResizeAndRotateEnabledForNetwork(true) // 對(duì)網(wǎng)絡(luò)圖片進(jìn)行resize處理逻澳,減少內(nèi)存消耗
2闸天,修改圖片默認(rèn)格式
????? 因?yàn)镕resco默認(rèn)圖片格式是RGB_8888,這就對(duì)內(nèi)存占用很高斜做,所以可以用內(nèi)存開(kāi)銷(xiāo)低一些的配置方式苞氮,比如:RGB_4444、RGB_565;
.setBitmapsConfig(Bitmap.Config.RGB_565)
3瓤逼,指定圖片加載尺寸笼吟,這里我直接貼上封裝在RecyclerCommonAdapter中圖片加載方法代碼(可以換成自己的方式):
public RecyclerViewHolder setFrescoImg(int viewId, Uri uri){
SimpleDraweeView simpleDraweeView = getView(viewId);
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
//指定寬高尺寸
.setResizeOptions(new ResizeOptions(
DisplayUtil.dp2px(mContext,360),DisplayUtil.dp2px(mContext,200)))
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.setOldController(simpleDraweeView.getController())
.build();
simpleDraweeView.setController(controller);
return this;
}
完整代碼
a,在項(xiàng)目Application里調(diào)用Fresco.initialize(this)完成初始化。
public class MyApplication extends Application{
@Overridepublic void onCreate() {
super.onCreate();
initFresco();
}
private void initFresco() {
//對(duì)ImagePipelineConfig進(jìn)行一些配置
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(getApplicationContext())
.setDownsampleEnabled(true)? ? ? ? ? ? ? ? ? ? ? ? ? ?? // 對(duì)圖片進(jìn)行自動(dòng)縮放
setResizeAndRotateEnabledForNetwork(true)?? // 對(duì)網(wǎng)絡(luò)圖片進(jìn)行resize處理霸旗,減少內(nèi)存消耗
.setBitmapsConfig(Bitmap.Config.RGB_565)??? //圖片設(shè)置RGB_565贷帮,減小內(nèi)存開(kāi)銷(xiāo)? fresco默認(rèn)情況下是RGB_8888
.build();
Fresco.initialize(this, config);
}
}
b,根據(jù)View的尺寸進(jìn)行縮放圖片(ResizeOptions),我是在recyclerView中加載圖片诱告,所以方法寫(xiě)在RecyclerViewHolder中了:
public RecyclerViewHolder setFrescoImg(int viewId, Uri uri){
SimpleDraweeView simpleDraweeView = getView(viewId);
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
???????????????????????????????????????? .setResizeOptions(new ResizeOptions( DisplayUtil.dp2px(mContext,360),DisplayUtil.dp2px(mContext,200)))
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.setOldController(simpleDraweeView.getController())
.build();
simpleDraweeView.setController(controller);
return this;
}
另外貼上DisplayUtil工具類(lèi)dp轉(zhuǎn)px方法
public class DisplayUtil{
public static int dp2px(Context context, float dipValue) {
????????? final float scale = context.getResources().getDisplayMetrics().density;
???????? return (int) (dipValue * scale + 0.5f);
}
}
c,圖片加載使用
直接調(diào)用方法就可以了,
eg:holder.setFrescoImg(R.id.video_img,Uri.parse(item.getposter));
如上撵枢,item.getPoster()就是服務(wù)端返回的圖片數(shù)據(jù);本人項(xiàng)目中這樣的寫(xiě)基本很少出現(xiàn)OOM了精居。