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部分做一些内存回收操作。或者是使用缓存图片等...

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

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5055139.html
Copyright © 2011-2022 走看看