Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
16lz
2022-07-05
好久没有写博客了,今天就先写一个小的关于在Android中加载大图如何避免内存溢出的问题。
后面会写如何使用缓存技术的核心类,android.support.v4.util.LruCache来加载图片。
直接上代码:
package com.example.oom_demo1;import android.os.Bundle;import android.app.Activity;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.Menu;import android.widget.ImageView;/** * Android高效加载大图、多图解决方案,有效避免程序OOM * 方法1 * **/public class MainActivity extends Activity {private ImageView mImageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageView = (ImageView) findViewById(R.id.imageView);//下面的代码非常简单地将任意一张图片压缩成100*100的缩略图,并在ImageView上展示。mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.drawable.a, 100, 100));}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);}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;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
注:
你需要在你的工程目录下加入一张直接的较大的图片,然后进行
mImageView.setImageBitmap(decodeSampledBitmapFromResource(
getResources(), R.drawable.a, 100, 100));改成你自己的图片文件即可。
更多相关文章
- Android(安卓)matrix 控制图片的旋转、缩放、移动
- android拍照与读取相册
- Android(安卓)报错:Caused by: android.os.FileUriExposedExcepti
- Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
- Android--SoLoader,android动态加载so库
- Android异步加载图像小结 (含线程池,缓存方法)
- android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0
- Android(安卓)Paging组件Demo
- Android(安卓)TabHost使用、动态加载内容