Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内存不足-位图大小超过VM预算_Java_Android_Memory_Imagebutton - Fatal编程技术网

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

Java 内存不足-位图大小超过VM预算,java,android,memory,imagebutton,Java,Android,Memory,Imagebutton,我已经为我的上下按钮寻找了很多解决方案,但似乎什么都没用。在程序中使用ImageButtons时,我能够在退出MemoryError之前按下三个ImageButtons。请告诉我任何帮助都会很好 for(int i = 0; i < keys.length; i++) { keys[i].setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTo

我已经为我的上下按钮寻找了很多解决方案,但似乎什么都没用。在程序中使用ImageButtons时,我能够在退出MemoryError之前按下三个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;
        }
    });
}

有没有一种简单的方法来垃圾收集、回收图像或其他任何东西?我被卡住了。

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

请确保您没有将活动或上下文存储在程序的任何其他部分中。这确实会扰乱内存管理,并导致大量泄漏

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

良好的形式

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
}
坏形式

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
}
基本上,我想说的是,大多数情况下,图像大小不是问题,而是像这种情况下容易忽略的东西

希望这有帮助


祝你好运

图像的大小是多少?每个ImageButtontry大约60kb,用于在主类中实现OnTouchListener方法,而不是使用内联类实例。尽管我怀疑它是否有用。我不确定它是否能解决问题…如果您只是更改图像,选择器xml文件会更好,除非您有理由不使用一个,但一个图像小于或大约60kb。。我有一个320kb的背景图像,但我不认为这是一个问题…图像的像素有多大?这才是最重要的。每个图像是300x300px。我想稍后使用平板电脑的按钮…在xml中,它位于80dip@antlersoft:我没有缩小图像尺寸,但缩小尺寸后问题消失了。顺便说一句,我的图像是200x200px我现在使用选择器…好多了!