OOM优化与Fresco图片加载框架

      项目开发中,常常会出现一个很难去解决的问题 - OOM。每个程序员说起oom第一反应都是很头疼,从最先的memoryCache与diskCache二级缓存的实现以及软引用、图片压缩的实现,到后来出现的xutils、universal-image-loader框架,知道后来的volley都不能有效的解决这个问题,所以今年来自Facebook的Fresco框架应运而生,通过C来控制图片加载的效率以及内存占用,比其他框架好了不止一筹。

想了解Fresco框架配置请看这里:点击打开链接

原文地址:http://www.tqwhcm.com/blog-192385-59640.html

Fresco框架是以SimpleDraweeView组件展开,功能很多都是建立在SimpleDraweeView设置或者配置上的。

一、关于Fresco框架一些导入问题以及解决办法


1、将Fresco四个项目库导入之后,可能会出现一些问题,需要检查一下四个库项目的一些配置

     1)版本 查找项目的project.projects文件,检测项目版本,如果你的eclipse没有该版本,请将项目版本修改为已有版本,比如target = android-19,我改为了target = android-14.
     2)  v4包 由于四个库项目的相互引用,四个项目最好只引用一个android-support-v4.jar包即可。如果重复,请保留drwee包下的v4包,其余v4删除即可
     3) v4包版本 - 有时候报错是找不到v4包下的xx类,那很有可能的原因就是当前引用的v4包不是最新的,建议更新     
     4) jar包的导入 -  如果是jar包没导入,最好是通过buildPath重新导入jar包        
     5) 项目引入库,只需引入fresco即可,如果也引入v7库项目,最好保存所有项目中的v4均为最新版本,且版本一致

二、Fresco框架的使用


      1、Fresco框架主要以SimpleDraweeView控件为主,该控件目前继承自ImageView,也基本可以满足开发需 要,控件引入以及注意事项, 需要在根布局添加声明:
xmlns:fresco="http://schemas.android.com/apk/res-auto"

     2、SimpleDraweeView添加网络图片资源,比较简单

Uri uri = Uri.parse("图片的网络url");
mDraweeView.setImageURI(uri);

     3、很多时候,需要显示图片呈圆角的,可以通过以下设置

public static void setRoundRadius(FrescoImageView iv, float radius) {
	RoundingParams params = new RoundingParams();
	params.setCornersRadius(radius);
	iv.getHierarchy().setRoundingParams(params);
}

      4、有些时候,我们需要设置默认显示的图片,以便于没有图片或加载错误时显示,默认不设置failureImage时,             加载失败图片与默认图片一致

public static void setFrescoParam(FrescoImageView iv, int defaultImg,ScaleType scalType) {
	GenericDraweeHierarchy mHierarchy = iv.getHierarchy();
	mHierarchy.setActualImageScaleType(scalType);
	mHierarchy.setPlaceholderImage(defaultImg);
}

      5、这里需要说明一下,通过Java代码设置的ScalType 只对图片资源有效,不包括默认图片以及加载失败图片,               所以需要设置默认图片或加载失败图片缩放,请在xml文件中配置

fresco:failureImage="@drawable/money_default_img"
fresco:failureImageScaleType="fitXY"
fresco:placeholderImage="@drawable/money_default_img"
fresco:placeholderImageScaleType="fitXY"

       6、设置宽高比例
mDraweeView.setAspectRatio(1.3);
       7、设置动态显示,Fresco很好的支持了Gif图片的显示

ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)).build();
DraweeController controller = Fresco.newDraweeControllerBuilder().setImageRequest(request).setAutoPlayAnimations(true).build();
fiv.setController(controller);


以上是记录了我在项目用到的Fresco一些用法,Fresco感觉相对来说不是太灵活,但是功能的强大是毋庸置疑的,项目换过几次图片加载框架,Fresco的表现是最好的。
       当然,内存溢出问题不能单单靠框架来解决,还需要注意以下几点,再加上Fresco框架的优秀表现,让OOM基本脱离我们的视界。

     1、关于对象节约内存,网上好多,能节约内存,尽量不要创建无所谓的对象,不用的时候尽量释放比较好。
     2、功能实现考虑功能开支,尽量减少内存消耗
     3、良好的代码习惯,尽量不要在循环中创建对象,或进行复杂的操作
     4、消耗资源比较多的对象,如线程、游标等不用的时候一定要关闭
     5、每一个Activity或Fragment页面内,加载图片的对象尽量在onDestroy时将背景或图片设为null,并释放Bitmap占用的空间。 listView与GridView这样大量占用资源的组件最好也释放掉,removeAllViews,并设为null
     6、图标资源的加载,大多还是通过bitmap的形式,图标的设计对宽高严格要求;bitmap的内存占用width * height * 像素,而一般图片的像素都是8位甚至更多,如果图片尺寸不控制,加载的时候内存会瞬间爆棚
     7、有一点需要说,就是很多人喜欢保存Activity,或者底部菜单保存Fragment对象,这样保存对象的方式强烈建议取消。因为Activity或Fragment对象得不到释放的时候,其内的资源很难得到释放,而往往底部菜单占用的资源是整个App最多的。Acticity保存时建议在OnDestroy或者onPause时remove掉,再次进入的时候重新加载。Fragment的页面切换使用replace的方式,而非show的方式。  
     8、程序退出时尽量释放掉可以释放的内存占用



你可能感兴趣的:(android,fresco,android,图片,oom,优化)