Java OutOfMemory错误需要解决

Java OutOfMemory错误需要解决,java,android,bitmap,Java,Android,Bitmap,我知道使用位图是一个常见的问题,但我不知道如何使用这个示例。特别是因为图像视图的大小不大,所以您会说它应该会导致内存错误。我想这是因为我经常创建位图,而不是创建一次,每五秒钟显示一次,但不知道怎么做。首先是创建位图的代码 java类TrapView: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int x = 20; Random r = new Random();

我知道使用位图是一个常见的问题,但我不知道如何使用这个示例。特别是因为图像视图的大小不大,所以您会说它应该会导致内存错误。我想这是因为我经常创建位图,而不是创建一次,每五秒钟显示一次,但不知道怎么做。首先是创建位图的代码

java类
TrapView

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int x = 20;
    Random r = new Random();
    int i1 = r.nextInt(900 - 200) + 200;
    rnd = new Random();
    //Linke Seite

    System.gc();

    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart);
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(image, i1, 300, true);
        float left = (float) 0;
        float top = (float) (getHeight() - resizedBitmap.getHeight());
        canvas.drawBitmap(resizedBitmap, left, top, paint);

        //rechte Seite
        Bitmap images = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart1);
        Bitmap resizedBitmaps = Bitmap.createScaledBitmap(images, getWidth()-resizedBitmap.getWidth()-OwlHole, 300, true);
        float left1 = (float) (getWidth() - resizedBitmaps.getWidth());
        float top1 = (float) (getHeight() - resizedBitmaps.getHeight());
        canvas.drawBitmap(resizedBitmaps, left1, top1, paint);
    }
}
在屏幕的右侧和左侧创建具有随机长度的可绘制图形

现在,我使用
处理程序在
main活动中每隔5秒调用一次:

final Handler h = new Handler();
Runnable r = new Runnable() {
    public void run() {
        System.gc();
        traps();
        h.postDelayed(this,5000); // Handler neustarten
    }
}

private void traps() {
    container = (ViewGroup) findViewById(R.id.container);
    trapViews tv = new trapViews(this);
    container.addView(tv,
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT);
    //tV.setImageCount(8);
    h.postDelayed(r, 5000);
}
首先,它工作起来就像我希望它工作一样。但每次出现一个新的抽绳器,我的游戏就落后了,在创造了5-6次抽绳器之后,它就崩溃了


System.gc()
bitmap.recycle
函数工作得不是很好。有人有解决方案吗?

记得在替换位图或位图不再可见时调用Bitmap.recycle()。
创建多个位图不是问题,但没有使用回收来释放内存而保留未使用的对象。

您每5秒创建一次位图,这不是一个好主意,因为它们总是相同的。您应该创建它们一次

 trapViews extends View{
    Bitmap image;
        Bitmap resizedBitmap;


        //rechte Seite
       Bitmap images ;
        Bitmap resizedBitmaps;

trapViews(Context c){
image = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart);
images = BitmapFactory.decodeResource(getResources(), R.drawable.stachelnstart1);

}

@Override
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int x = 20;
        Random r = new Random();
        int i1 = r.nextInt(900 - 200) + 200;
        rnd = new Random();
        //Linke Seite
          //I have left this bitmap in the here as it is affected by the random int
         resizedBitmap = Bitmap.createScaledBitmap(image, i1, 300, true);
            float left = (float) 0;
            float top = (float) (getHeight() - resizedBitmap.getHeight());
            canvas.drawBitmap(resizedBitmap, left, top, paint);

          //create this bitmap here as getWidth() will return 0 if created in the view's constructor
        if(resizedBitmaps == null)
         resizedBitmaps = Bitmap.createScaledBitmap(images, getWidth()-resizedBitmap.getWidth()-OwlHole, 300, true);
            float left1 = (float) (getWidth() - resizedBitmaps.getWidth());
            float top1 = (float) (getHeight() - resizedBitmaps.getHeight());
            canvas.drawBitmap(resizedBitmaps, left1, top1, paint);

}


}

为什么在方法范围内反复读取和解码?当你构建对象并重用它时,只做一次。是的,这就是我想做的。但是我不明白怎么做。您有任何示例吗?在可运行/可调用类构造函数中或在拥有onDraw的类中进行。我更喜欢第二个。你可以在你的项目中尝试使用java profiler。这个链接可以帮助你更好地理解内存泄漏,如果你在我的代码上给我看,我会为你做很多工作吗?我太业余了,不知道我现在要改变什么^^^老实说,我真的很高兴走到这一步。是的,我知道,但我认为在我回收它们之前,同时显示10个位图应该是可以的。它开始滞后于我显示的第一个位图,所以我认为我的问题与循环功能无关。位图在初始状态下的大小是多少?不客气。如果这是你想要的,请接受答案