• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android高效加载大图、多图解决方案,有效避免程序OOM,androidoom

Android高效加载大图、多图解决方案,有效避免程序OOM,androidoom

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android oom解决,android oom是什么,android oom分析,android oom异常,android 图片oom等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android高效加载大图、多图解决方案,有效避免程序OOM,androidoom


我们可以通过下面的代码看出每个应用程序最高可用内存是多少

int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);   
Log.d("TAG", "Max memory is " + maxMemory + "KB");

 

  BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片可以使用decodeResource方法。

  这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。如下代码所示:

BitmapFactory.Options options = new BitmapFactory.Options();   
options.inJustDecodeBounds = true;   
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);   
int imageHeight = options.outHeight;   
int imageWidth = options.outWidth;   
String imageType = options.outMimeType;

 

  那我们怎样才能对图片进行压缩呢?

  通过设置BitmapFactory.Options中inSampleSize的值就可以实现。比如我们有一张2048*1536像素的图片,将inSampleSize的值设置为4,就可以把这张图片压缩成512*384像素。原本加载这张图片需要占用13M的内存,压缩后就只需要占用0.75M了(假设图片是ARGB_8888类型,即每个像素点占用4个字节)。下面的方法可以根据传入的宽和高,计算出合适的inSampleSize值: 

public static int calculateInSampleSize(BitmapFactory.Options options,   
        int reqWidth, int reqHeight) {   
    // 源图片的高度和宽度   
    final int height = options.outHeight;   
    final int width = options.outWidth;   
    int inSampleSize = 1;   
    if (height > reqHeight || width > reqWidth) {   
        // 计算出实际宽高和目标宽高的比率   
        final int heightRatio = Math.round((float) height / (float) reqHeight);   
        final int widthRatio = Math.round((float) width / (float) reqWidth);   
        // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高   
        // 一定都会大于等于目标的宽和高。   
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;   
    }   
    return inSampleSize;   
}

使用图片缓存技术

 

内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache (此类在android-support-v4的包中提供) 。这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。

 

在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。但是现在已经不再推荐使用这种方式了,因为从 API Level 9开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。
另外,API Level 11中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。

 

 

 

 

 

 

  

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android高效加载大图、多图解决方案,有效避免程序OOM,androidoom
  • 关于Android滑动冲突的解决方法(二)

相关文章

  • 2017-07-22Android-SQLite和SQLiteOpenHelper
  • 2017-05-26ionic打包项目,运行时报错A problem occurred configuring root project &#39;android&#39;。。。,ionicconfiguring
  • 2017-05-26Android开发技术周报 Issue#67
  • 2017-05-26更多,更多大片访问
  • 2017-05-26Android MediaPlayer 音乐播放
  • 2017-05-224.1.2 Activity初窥门径
  • 2017-05-26redis配置文件参数解释说明
  • 2017-05-26转载:android MVC设计模式,androidmvc
  • 2017-05-26机顶盒上gridview+ScrollView的使用。,gridviewscrollview
  • 2017-05-26BottomBar之Android底部菜单,bottombarandroid

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 仿拉手团购App5--登录界面,团购app5--登录界面
    • 安卓7.0首批截图公布:惊现汉堡菜单,安卓汉堡
    • 使用软引用和弱引用防止内存溢出,引用防止内存溢出
    • Android-通过Java代码来实现属性动画
    • Android中&quot;get&quot;,&quot;post&quot;请求的其中三种常用数据提交方式,android常用数据
    • 自定义控件(一),自定义控件(
    • go 常用命令扼要说明
    • 安卓ProgressBar水平进度条的颜色设置
    • Android 日常开发总结的技术经验 60 条,android60
    • 配置Nginx反向代理Exchange 2007上的OWA

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有