项目开发中,常常会出现一个很难去解决的问题 - OOM。每个程序员说起oom第一反应都是很头疼,从最先的memoryCache与diskCache二级缓存的实现以及软引用、图片压缩的实现,到后来出现的xutils、universal-image-loader框架,知道后来的volley都不能有效的解决这个问题,所以今年来自Facebook的Fresco框架应运而生,通过C来控制图片加载的效率以及内存占用,比其他框架好了不止一筹。
想了解Fresco框架配置请看这里:http://www.fresco-cn.org/docs/index.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"
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view" android:layout_width="20dp" android:layout_height="20dp" fresco:placeholderImage="@drawable/my_drawable"/>
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、程序退出时尽量释放掉可以释放的内存占用
共同学习,写下你的评论
评论加载中...
作者其他优质文章