归志宁无五亩园,读书本意在元元。这篇文章主要讲述Android高效加载大图多图解决方案,有效避免程序OOM相关的知识,希望能为你提供帮助。
前言:android手机分配给给个应用的内存空间都是有限的,当图片像素>
屏幕像素时,会造成内存浪费,严重时更会造成oom,当图片像素<
屏幕像素时,又会导致展示出来的图片失真,因此一个好的图片框架应该解决内存分配的问题。
一般做法:
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小 final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // 调用上面定义的方法计算inSampleSize值 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); }
1.先将BitmapFactory.option.inJustDecodeBounds = true,这样只会加载图片的宽高等信息,并不会将图片加载进内存。
2.根据imageview控件的大小和图片大小计算出比例关系inSampleSize,并设置给options.inSample
3.将options.inJustDecodeBounds = false,再重新加载图片,这下加载的图片就是压缩之后的图片。
【Android高效加载大图多图解决方案,有效避免程序OOM】还有一种情况,在listview或者gridview中加载大量图片时,都会去访问网络,这样也是会影响性能的,因此使用LruCache(最近最少使用原则)可以把一些重要的图片资源加载到内存中(LinkedHashMap),可以解决重复访问网络的问题。
推荐阅读
- 原生安卓去除网络叉号
- 利用WindowsServiceWrapper(WinSW)将nginx包装为系统服务
- Mac + Android之Android Studio 环境搭建,AVD模拟器运行(包括Genymotion模拟器插件配置运行)
- 微信https抓包,不同安卓版本微信版本对证书的要求
- 安卓触控一体机为什么得到大家认可(远比Windows系统一体机大受欢迎)
- app.config的坑
- Appium--定位方式
- Some Android functions
- Appium原理