为了账号安全,请及时绑定邮箱和手机立即绑定

OOM优化与Fresco图片加载框架

标签:
Android

项目开发中,常常会出现一个很难去解决的问题 - 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、程序退出时尽量释放掉可以释放的内存占用

原文链接:http://www.apkbus.com/blog-192385-59640.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消