OOM优化与Fresco图片加载框架

来源:互联网 发布:java sql盲注解决方案 编辑:程序博客网 时间:2024/04/29 04:01

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



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工作3天不下去怎么办 在新公司融不进去怎么办 药流吃药吐了怎么办 药流期间发烧了怎么办 药流时第一天出现呕吐怎么办有事吗 药流第一天忘记第二次吃药了怎么办 药流吃药后吐了怎么办 药流只排血块不见孕囊怎么办 药流三天还有血怎么办 药流15天同房了怎么办 药流22天同房了怎么办 药流一直不排出怎么办 宝宝脸过敏红了怎么办 小孩湿疹脸上都是红红的怎么办 眼周刺痛红红的怎么办 脸敷面膜刺痛红红的怎么办 脸上有凹凸不平的坑怎么办 宝宝脸上角质层薄有红血丝怎么办 红衣军到决赛圈怎么办 宝宝湿疹留下的黑印怎么办 出牙宝宝很烦躁怎么办 法斗嘴唇破了怎么办 狗嘴巴周围红了怎么办 脸上起红包还痒怎么办 睾丸胀痛有下坠感怎么办 英语不好又不会读怎么办 七个月宝宝手上长倒刺怎么办 字母纹身纹反了怎么办 花甲生的吃了怎么办 别人告我欠他钱怎么办 实习手册没有公司的印章怎么办? 家长管的太严怎么办 对于老公沉迷于股票怎么办 月经期吃了香瓜怎么办 月经漏到内裤上怎么办 上班没时间养狗怎么办 宝宝呼吸道感染反复发烧怎么办 熬夜后头晕想吐怎么办 生气后全身无力酸痛怎么办? 久坐导致的腰疼怎么办 削土豆手变黑了怎么办