Я знаю, что это обычная проблема при работе с растровыми изображениями, но я не знаю, как продолжить с примером. Тем более, что размер представления изображения невелик, что, как вы бы сказали, должно вызывать ошибку памяти. Я думаю, это потому, что я часто создаю растровые изображения вместо того, чтобы создавать их один раз, и отображать их каждые пять секунд, но не знаю, как это сделать. Прежде всего, код для создания растровых изображений.

Java-класс trapViews:

@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);
    }
}

Создает объект для рисования произвольной длины в правой и левой части экрана.

Теперь я вызываю это каждые 5 секунд в MainActivity с Handler:

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 работают не очень хорошо. У кого-нибудь есть решение?

-1
Hendrx 25 Ноя 2016 в 16:31

2 ответа

Лучший ответ

Вы создаете растровые изображения каждые 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);

}


}
1
Niza Siwale 25 Ноя 2016 в 13:48

Не забудьте вызвать Bitmap.recycle () после замены растрового изображения или когда оно больше не отображается. Создание нескольких растровых изображений не является проблемой, но остаются неиспользуемые объекты без повторного использования для освобождения памяти.

1
Farasy 25 Ноя 2016 в 13:41