内存不足 - 位图大小超过VM预算

时间:2012-03-16 23:04:13

标签: java android memory imagebutton

我已经搜索了很多关于我的向上和向下按钮的解决方案,似乎无法正常工作。在程序中使用ImageButtons时,我可以在出现OutOfMemoryError之前按三个ImageButtons。请任何帮助都会很棒。

for(int i = 0; i < keys.length; i++)
{
    keys[i].setOnTouchListener(new View.OnTouchListener() 
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
            if(event.getAction() == MotionEvent.ACTION_DOWN)
            {
                for(int down = 0; down < keys.lenght; down++)
                {
                    if(v == keys[down])
                    {
                        keys[down].keys[down].setImageResource(drawIDDOWN[down]);
                        keys[down].setAdjustViewBounds(true);
                    }
                }
             }
             if(event.getAction() == MotionEvent.ACTION_UP)
             {
                 for(int up = 0; up < keys.length; up++)
                 {
                     if(v == keys[up])
                     {
                         keys[up].setImageResource(drawIDUP[up]);
                         keys[up].setAdjustViewBounds(true);
                     }
                 }
             }
        return false;
        }
    });
}

这是LogCat:

threadid=1: thread exiting with uncaught exception     
FATAL EXCEPTION: main
java.lang.OutOfMemoryError: bitmap size    exceeds VM budget
android.graphics.Bitmap.nativeCreate(Native Method)
android.graphics.Bitmap.createBitmap(Bitmap.java:477)
android.graphics.Bitmap.createBitmap(Bitmap.java:444)
android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
android.content.res.Resources.loadDrawable(Resources.java:1709)
android.content.res.Resources.getDrawable(Resources.java:581)
android.widget.ImageView.resolveUri(ImageView.java:501)
android.widget.ImageView.setImageResource(ImageView.java:280)
f7kidzCalc.com.KidzCalcActivity$1.onTouch(KidzCalcActivity.java:253)
android.view.View.dispatchTouchEvent(View.java:3881)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent
(PhoneWindow.java:1691)
com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent
(PhoneWindow.java:1125)
android.app.Activity.dispatchTouchEvent(Activity.java:2096)
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent
(PhoneWindow.java:1675)
android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194)
android.view.ViewRoot.handleMessage(ViewRoot.java:1878)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:3683)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
dalvik.system.NativeStart.main(Native Method)

有没有简单的方法来垃圾收集,回收图像或任何东西?我被卡住了..

2 个答案:

答案 0 :(得分:1)

缩小您正在使用的图像的大小。我遇到了确切的问题。我使用的图像是> 500kB。缩小尺寸约为50-60kB。

答案 1 :(得分:1)

确保您没有将活动或上下文存储在程序的任何其他部分中。这真的与你的记忆管理混淆并导致大量泄密。

您可以使用以下方法发送指针:

良好表格

public void doSomethingtoContext(Context c){
   c.getApplicationContext()....//Variable 'c' only lasts for the length of the method
}

错误表单

public static Context cOnText;
public void doSomethingtoContext(Context c){
   cOnText = c; //DO NOT STORE THIS VALUE HERE
}

基本上,我想说的是,大多数时候图像尺寸不是问题,而是像这种情况一样容易被忽视的东西。

希望这有帮助。

祝你好运!