美文网首页
Bitmap加载、缓存机制

Bitmap加载、缓存机制

作者: 西鳳梨 | 来源:发表于2017-01-13 13:47 被阅读0次

    在Android开发中经常会遇到关于图片加载、缓存的问题,经常会遇到内存溢出OOM,Android对单个应用内存加载的限制16MB。关于本篇文章从三个方面进行分析图片加载中遇到的问题:Bitmap压缩、缓存机制、优化卡顿

    Bitmap压缩

    关于Bitmap高效加载,BitmapFactory进行图片解压缩步骤:

    1、将BitmapFacory.Options的injustDecodeBounds参数设为TRUE并加载图片;

    2、从BitmapFactory.Options中取出图片的原始宽高信息,对应outWidth和outHeight参数;

    3、根据采样率的规则并结合目标View所需大小计算出采样率inSampleSize;

    4、将Bitmapfactory.Options的inJustDecodeBounds参数设置为FALSE,然后重新加载图片。

    缓存机制

    首先要考虑图片的三级缓存机制,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

    网络加载,不优先加载,速度慢,浪费流量

    本地缓存,次优先加载,速度快

    内存缓存,优先加载,速度最快

    1、LRUCache(least Recently Used)最近最少使用算法,采用LRU算法缓存包括LRUCache和DiskLRUCache。利用这二者可以实现使用ImageLoader。LRUCache是Android3.1提供缓存类,通过support-v4兼容之前的版本,是一个泛型类,采用linkedHashmap<E,V>以强引用的方式存储外界对象

    2、DiskLRUCache实现磁盘缓存。将缓存对象写入文件系统实现缓存数据,DiskLRUCache得到Android官方文档推荐,不属于AndroidSDK的一部分,源码可在网络自行下载。DiskLRUCache采用open方法创建自身

    2.1、DiskLRUCache缓存对象写入

    通过edit()获取Editor对象,通过它获取一个文件输出流想文件系统中写入数据,并通过Editor.commit()提交写入操作。如果图片下载过程发生异常,还可以通过Editor的abort()方法退回操作。

    2.2、DiskLRUCache缓存查找

    首先通过url转换成key,DiskLruCache的get方法获取Snapshot对象,通过Snapshot对象得到缓存的文件输入流。

    优化列表卡顿

    禁止在getView执行耗时操作,直接在getView中加载图片将会直接影响显示效果,必须通过ImageLoader实现异步操作;

    控制异步任务执行频率,通过给ListView or GridView设置setOnScrollListenser.onScrollStateChanged方法中增加判断列表是否处于滑动状态决定执行加载图片操作

    开启硬件加速

    监控内存变化情况

    然后在打开DDMS, 选择Heap标签,然后点击Cause GC按钮,点击Cause GC是手动触发JAVA垃圾回收器,如下图


    针对Bitmap加载是否会产生内存泄露,我们可以反复进入和退出这个Activity, 再手动触发几次垃圾回收,观察上图中 data object这一栏中的 Total Size的大小是保持稳定还是有明显的变大趋势,如果有明显的变大趋势就说明这个Activity存在内存泄露的问题,我们就需要在具体分析。

    相关文章

      网友评论

          本文标题:Bitmap加载、缓存机制

          本文链接:https://www.haomeiwen.com/subject/uyhsbttx.html