2.3.3中的Android outofmemory错误位图大小超过了vm预算

我明白这个问题被问几次。 这些解决方案中没有一个是清楚的。 让我解释一下这个问题。

  • 我有一个活动,一次加载4个图像。
  • 我在onResume()方法中加载图像。
  • 加载时,活动抛出位图错误。
  • 笔记。

  • 我使用setImageResource(R.drawable.xxxx)方法调用设置图像,而不是直接绘制位图。
  • 图像正确缩放。
  • 在2.3之前的所有模拟器中都采用了WORKS FINE,并且在实际设备(Samsung Galaxy 5)中处于工作状态,
  • 错误出现在第一次初始化时,并且没有方向更改事件被触发。
  • 图像尺寸为800 x 600,平均大小为15kb(每个)。
  • 让我知道任何解决方案。 另外让我知道你是否有类似的问题与Android 2.3.3模拟器。

    [更新] - 小片

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                ...
        img_topLeft = (ImageView) findViewById(R.id.Img_Alph_Q_TopLeft);
        img_topRight = (ImageView) findViewById(R.id.Img_Alph_Q_TopRight);
        img_bottomLeft = (ImageView) findViewById(R.id.Img_Alph_Q_BottomLeft);
        img_bottomRight = (ImageView) findViewById(R.id.Img_Alph_Q_BottomRight);
       ...
       }
    protected void onResume() {
        super.onResume();
                img_topLeft.setImageResource(R.drawable.xxx);
                img_topRight.setImageResource(R.drawable.xxx);
                img_bottomLeft.setImageResource(R.drawable.xxx);
                img_bottomRight.setImageResource(R.drawable.xxx);
       ...
       }
    

    03-21 08:59:17.362:ERROR / dalvikvm-heap(5883):4320000字节的外部分配对于此进程来说太大。 03-21 08:59:17.412:错误/ GraphicsJNI(5883):VM不会让我们分配4320000字节03-21 08:59:17.432:错误/ AndroidRuntime(5883):致命例外:main 03-21 08: 59:17.432:错误/ AndroidRuntime(5883):java.lang.OutOfMemoryError:位图大小超过虚拟机预算03-21 08:59:17.432:错误/ AndroidRuntime(5883):at android.graphics.Bitmap.nativeCreate(Native Method) 03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.graphics.Bitmap.createBitmap(Bitmap.java:477)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android。 graphics.Bitmap.createBitmap(Bitmap.java:444)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)03-21 08:59: 17.432:错误/ AndroidRuntime(5883):在android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.graphics.BitmapFactory.decodeStream(BitmapFactory .java:473)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at android.graphics.BitmapFact ory.decodeResourceStream(BitmapFactory.java:336)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)03-21 08:59: 17.432:错误/ AndroidRuntime(5883):在android.content.res.Resources.loadDrawable(Resources.java:1709)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.content.res.Resources .getDrawable(Resources.java:581)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at android.widget.ImageView.resolveUri(ImageView.java:501)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):在android.widget.ImageView.setImageResource(ImageView.java:280)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在Quiz.java:124)03-21 08:59 :17.432:错误/ AndroidRuntime(5883):Quiz.onResume(Quiz.java:92)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150 )03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.app.Activity.performResume(Activity.java:3832 )03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android .app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)03-21 08:59 :17.432:错误/ AndroidRuntime(5883):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.app.ActivityThread $ H .handleMessage(ActivityThread.java:931)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.os.Handler.dispatchMessage(Handler.java:99)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.os.Looper.loop(Looper.java:123)03-21 08:59:17.432:错误/ AndroidRuntime(5883):在android.app.ActivityThread.main(ActivityThread.java: 3683)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at java.lang.reflect.Method.invokeNat ive(Native Method)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at java.lang.reflect.Method.invoke(Method.java:507)03-21 08:59:17.432:ERROR / AndroidRuntime (5883):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at com.android.internal.os。 ZygoteInit.main(ZygoteInit.java:597)03-21 08:59:17.432:ERROR / AndroidRuntime(5883):at dalvik.system.NativeStart.main(Native Method)

    谢谢。 管理解决它。 为其他人的利益分享代码解决此问题的自定义类。 基于@ Janardhanan.S链接。

    public class BitmapResizer {
    
    public static Bitmap decodeImage(Resources res, int id ,int requiredSize){
        try {
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(res, id, o);
    
            //Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE=requiredSize;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }
    
            //decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeResource(res, id, o2);
        } catch (Exception e) {
    
        }
        return null;
    }
    
    }
    
    //Class call
    int requiredsize = 100; // Still playing around with this number to find the optimum value
    img_topLeft.setImageBitmap(BitmapResizer.decodeImage(getResources(),
            AlphResourceSet.R.drawable.xxx, requiredsize));
    

    位图消耗大量内存空间。 不要为您在活动中加载的所有图像创建一个新的位图变量,而是可以创建一个位图变量并尽可能多地重用它们。

    你可以使用这个片段来调整位图的大小

    http://pastebin.com/D8vbQd2u


    你可以发布Activity + stacktrace的代码片段吗?

    你是否已经检查过避免内存泄漏文章?

    特别是以下部分:

    将Drawable附加到视图时,该视图将设置为drawable上的回调。 在上面的代码片断中,这意味着drawable有一个对TextView的引用,它本身具有对活动(Context)的引用,该引用依次引用几乎任何东西(取决于您的代码)。


    看起来这些图像本质上是非常重的。 我建议启动实际返回位图实例的AsyncTimer,并在AsyncTask的doBackground()中传递图像ID,并使用createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) Bitmap类的方法。

    链接地址: http://www.djcxy.com/p/5757.html

    上一篇: Android outofmemory error bitmap size exceeds vm budget in 2.3.3

    下一篇: Fast permutation of bits in C#