加载大图及图片资源的释放

来源:互联网 发布:ncbi数据库简介 编辑:程序博客网 时间:2024/04/29 14:37

android开发中如果加载一张较大的图片直接内存爆炸,我也是头疼了好长时间,以下是我找到的的解决方案。

完整解决方案地址:https://my.oschina.net/u/1389206/blog/324731

设置 读取图片的参数,使用decodeStream进行图片读取。

尽量不要使用setImageBitmapsetImageResourceBitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的  source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。


使用方式:

public static Bitmap readBitMap(Context context, int resId) {        BitmapFactory.Options opt = new BitmapFactory.Options();        opt.inPreferredConfig = Bitmap.Config.RGB_565;        opt.inPurgeable = true;        opt.inInputShareable = true;        //  获取资源图片        InputStream is = context.getResources().openRawResource(resId);        return BitmapFactory.decodeStream(is, null, opt);    }

对于RGB565的说明:http://blog.csdn.net/xiaoyaovsxin/article/details/8446698


使用完资源后在ondestroy进行释放:

protected void onDestroy() {        //BitmapDrawable drawable= (BitmapDrawable) layout.getBackground();
//Bitmap bitmap=drawable.getBitmap();
       //先取得图片资源再调用一下内容

        if(bitmap!=null&&!bitmap.isRecycled())        {            bitmap.recycle();            bitmap=null;            drawable=null;        }        System.gc();        super.onDestroy();    }


0 0