zoukankan      html  css  js  c++  java
  • Android Bitmap OutOfMemory 解决的方法

          在Android应用里,最耗费内存的就是图片资源。并且在Android系统中。读取位图Bitmap时,分给虚拟机中的图片的堆栈大小仅仅有8M。假设超出了。就会出现OutOfMemory异常

    E/AndroidRuntime(  697): java.lang.OutOfMemoryError
    E/AndroidRuntime(  697):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    E/AndroidRuntime(  697):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
    E/AndroidRuntime(  697):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
    E/AndroidRuntime(  697):     at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376)
    E/AndroidRuntime(  697):     at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406)
    E/AndroidRuntime(  697):     at com.example.imagetoshow2.ImageAdapter.createReflectedImages(ImageAdapter.java:66)
    E/AndroidRuntime(  697):     at com.example.imagetoshow2.ImageAdapter.getView(ImageAdapter.java:54)
    E/AndroidRuntime(  697):     at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)


    解决的方法:

    1.及时回收内存

     if(bitmap != null && !bitmap.isRecycled()){ 
            // 回收而且置为null
            bitmap.recycle(); 
            bitmap = null; 
    } 
    System.gc();
    在适当的地方使用上述代码,将临时不需使用的的回收掉。当然system.gc不应该频繁调用,否则会使系统效率减少。


    2.使用BitmapFactory.Options对图片进行压缩

     BitmapFactory.Options opts = new BitmapFactory.Options();  
    			 opts.inSampleSize = n; 
    			 
    	         bitmap = BitmapFactory.decodeStream(fis, null, opts);

    使用inSampleSize设置放缩比例,默认值为0,设置一个大于0的数便可对图片进行压缩。

     BitmapFactory.Options opts = new BitmapFactory.Options();
    
        // 设置inJustDecodeBounds为true
    
        opts.inJustDecodeBounds = true;
    
        // 使用decodeFile方法得到图片的宽和高
    
        BitmapFactory.decodeFile(path, opts);

    使inJustDecodeBounds为true后,再使用decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap为null。仅仅会计算出options.outWidth和options.outHeight值。在下次使用BitmapFactory的decodeFile()等方法实例化Bitmap对象前。将opts.inJustDecodeBound设置回false就能够得到图片了。


    3.代码优化

    为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常停止执行。通常。在实例化Bitmap的代码中,对OutOfMemory异常进行捕获

    <span style="font-size:18px;"> <span style="font-size:18px;">Bitmap bitmap = null;
    try {
        // 实例化Bitmap
        bitmap = BitmapFactory.decodeFile(path);
    } catch (OutOfMemoryError e) {
        //
    }</span></span>
    然后在Catch部分做一些内存回收操作。或者是使用缓存图片等...

    总是良好的编程风格和优质的代码结构是程序猿的无上追求....

  • 相关阅读:
    【CANoe基础】CANoe常用操作
    ZedGraph控件横纵坐标显示中文名(转)
    Winforn中设置ZedGraph曲线图的属性、坐标轴属性、刻度属性(转)
    c# 访问sqlite资源
    混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
    ABP框架资源
    vue新建项目一直在downloading template转,最后超时
    vscode(实验)--ABP框架 .net core 版本的安装与运行(vue模板)(转)
    安装-打开-运行-ABP框架(asp.net core 2.X+Vue)运行前端(转)
    VSCode打开Visual Studio的ABP框架项目(转)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5055139.html
Copyright © 2011-2022 走看看