Android开发中消耗内存较多一般都是在图像上面
加载图像有三种途径
1.从网络加载
2.从文件读取
3.从资源文件加载
针对这三种情况我们一般使用BitmapFactory的:decodeStream,
decodeFile,decodeResource,这三个函数来获取到bitmap然后再调用ImageView的setImageBitmap函数进行展现。
我们的内存去哪里了(为什么被消耗了这么多):
其实我们的内存就是去bitmap里了,BitmapFactory的每个decode函数都会生成一个bitmap对象,用于存放解码后的图像,然后返回该引用。如果图像数据较大就会造成bitmap对象申请的内存较多,如果图像过多就会造成内存不够用自然就会出现out of memory的现象。
public static Bitmap getFitSampleBitmap(String file_path, int width, int height) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file_path, options);
options.inSampleSize = getFitInSampleSize(width, height, options);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(file_path, options);
}
public static int getFitInSampleSize(int reqWidth, int reqHeight, BitmapFactory.Options options) {
int inSampleSize = 1;
if (options.outWidth > reqWidth || options.outHeight > reqHeight) {
int widthRatio = Math.round((float) options.outWidth / (float) reqWidth);
int heightRatio = Math.round((float) options.outHeight / (float) reqHeight);
inSampleSize = Math.min(widthRatio, heightRatio);
itmapFactory提供了BitmapFactory.Option,用于设置图像相关的参数,在调用decode的时候我们可以将其传入来对图像进行相关设置。这里我们主要介绍option里的两个成员:inJustDecodeBounds(Boolean类型) 和inSampleSize(int类型)。
inJustDecodeBounds :如果设置为true则表示decode函数不会生成bitmap对象,仅是将图像相关的参数填充到option对象里,这样我们就可以在不生成bitmap而获取到图像的相关参数了。
inSampleSize:表示对图像像素的缩放比例。假设值为2,表示decode后的图像的像素为原图像的1/2。在上面的代码里我们封装了个简单的getFitInSampleSize函数(将传入的option.outWidth和option.outHeight与控件的width和height对应相除再取其中较小的值)来获取一个适当的inSampleSize。
在设置了option的inSampleSize后我们将inJustDecodeBounds设置为false再次调用decode函数时就能生成bitmap了
}
return inSampleSize;
}
分享到:
相关推荐
Android 异步加载图片缓存优化能异步加载图片,并缓存到本地,采用一级缓存,二级缓存和本地缓存,避免oom异常。源码中有详细注释,资料中有jar包,可以直接复制到项目中使用。
采用区块复用加载,优化内存占用,有效避免OOM, 注意:支持网络图片、本地图片。 更新日志 v0.0.5新增:可设置缩放比例、缩放动画时间。 v1.2.0新增:可设置多种加载策略(仅普清、仅原图、手动模式、网络自适应)...
很多朋友在Android开发listview过程中都会碰到问题 比如从网上下载图片显示在界面 如果图片稍微大一点就会出现oom 或者显示的时候很容易出现图片闪烁等 这个项目能帮你解决
采用区块复用加载,优化内存占用,有效避免OOM。支持手势下拉退出。注意:本框架支持网络图片、本地图片、支持gif动图、支持Android 11。后续可能会仅维护androidx版本,support请尽快迁移到androidx。参考官方迁移...
Android开发发展到今天也是已经比较成熟,各种新框架,新技术也是层出不穷,而内存优化一直都是Android开发过程一个不可避免的话题。恰好最近做了内存优化相关的工作,这里也对Android内存优化相关的知识做下总结。...
Android自定义view,实现刮奖效果,可以直接移植到工程里面直接使用。ScratchView对内存做了优化,最大程度避免OOM。不足之处就是没有做其他属性的扩展,比如自定义view的padding处理等。
最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来。所以决定抽空学习总结...
8-避免程序的OOM异常 9-线程池原理 10-UI性能优化 11-内存优化之字符串优化 12-常见内存优化方式 13-性能分析之hierarchyviewer使用 14-性能分析之Lint规范代码 15-性能分析之突破内存不足 16-性能分析之...
1. 图片的二次采样,避免图片太大OOM public class MainActivity extends AppCompatActivity { private int MY_PERMISSIONS_REQUEST_CALL_PHONE=1000; @Override protected void onCreate(Bundle ...
Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ........................................................... 2 iOS .........................................
有米广告的引用7.Adapter的优化,主要是ViewHolder的使用,避免对View重复解析创建8.各种资源的使用,包括,drawable,raw和asset目录下资源的使用9.屏幕适配,所有涉及到长度的数值,都是用dip,并且在dimens.xml中...