• BitmapFactory.Options避免 内存溢出 OutOfMemoryError的优化方法


    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,
    因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

    因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,
    decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,
    无需再使用java层的createBitmap,从而节省了java层的空间。
    如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常
    另外,decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 
    使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 
    否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。

    另外,以下方式也大有帮助:
    1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
         BitmapFactory.Options options=new BitmapFactory.Options();
         options.inJustDecodeBounds = false;
         options.inSampleSize = 10;   //width,hight设为原来的十分一
         Bitmap btp =BitmapFactory.decodeStream(is,null,options);
    2. if(!bmp.isRecycle() ){
             bmp.recycle()   //回收图片所占的内存
             system.gc()  //提醒系统及时回收
    }

    以下奉上一个方法:

    Java代码

       1. /**
       2.  * 以最省内存的方式读取本地资源的图片
       3.  * @param context
       4.  * @param resId
       5.  * @return
       6.  */  
       7. public static Bitmap readBitMap(Context context, int resId){  
       8.     BitmapFactory.Options opt = new BitmapFactory.Options();  
       9.     opt.inPreferredConfig = Bitmap.Config.RGB_565;   
      10.     opt.inPurgeable = true;  
      11.     opt.inInputShareable = true;  
      12.        //获取资源图片  
      13.     InputStream is = context.getResources().openRawResource(resId);  
      14.         return BitmapFactory.decodeStream(is,null,opt);  
      15. }

     

    优化Dalvik虚拟机的堆内存分配

    对 于Android平台来说,其托管层使用的Dalvik JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体 原理我们可以参考开源工程,这里我们仅说下使用方法:   private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

    介绍一下图片占用进程的内存算法吧。
    android中处理图片的基础类是Bitmap,顾名思义,就是位图。占用内存的算法如下:
    图片的width*height*Config。
    如果Config设置为ARGB_8888,那么上面的Config就是4。一张480*320的图片占用的内存就是480*320*4 byte。
    前面有人说了一下8M的概念,其实是在默认情况下android进程的内存占用量为16M,因为Bitmap他除了java中持有数据外,底层C++的 skia图形库还会持有一个SKBitmap对象,因此一般图片占用内存推荐大小应该不超过8M。这个可以调整,编译源代码时可以设置参数。

     

    REFRENCENS:http://yueguc.iteye.com/blog/1051966

    http://www.ophonesdn.com/forum/thread-2600-3-1.html

    http://orgcent.com/android-outofmemoryerror-load-big-image/

  • 相关阅读:
    20190817-T1-LOJ6322「雅礼国庆 2017 Day6」Star Way To Heaven
    20190817-涪
    20190816-周期
    考试总结 模拟95
    考试总结 模拟94
    考试总结 模拟93
    考试总结 模拟92
    考试总结 模拟91
    考试总结 模拟90
    考试总结 模拟89
  • 原文地址:https://www.cnblogs.com/anee/p/2719900.html
Copyright © 2020-2023  润新知