2016-11-25 171 views
-1

我知道這是使用位圖的常見問題,但我不知道如何繼續使用示例。特別是因爲圖像視圖的大小並不大,你會說它應該會導致內存錯誤。我認爲這是因爲我經常創建位圖,而不是一旦螞蟻每隔5秒顯示一次就創建它,但不知道如何去做。首先創建位圖的代碼。OutOfMemory錯誤需要解決方案

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

創建右邊和屏幕的左側具有隨機長度的可繪製。

現在,我稱這種現象爲MainActivity每5秒一個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); 
} 

首先,它的工作就像我想要的工作。但每次出現新的drawable時,我的遊戲都會滯後,並且經過5-6次創建一次後會崩潰

System.gc()bitmap.recycle函數不能很好地工作。有人有解決方案嗎?

+3

爲什麼在方法範圍內一次又一次地讀取和解碼?在構建對象並重用它時執行一次。 – duffymo

+0

是啊這就是我想要做的。但我沒有得到如何。你有什麼樣的例子嗎? – Hendrx

+0

在Runnable/Callable類構造函數中或在擁有onDraw的類中執行此操作。我更喜歡第二個。 – duffymo

回答

1

您每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); 

} 


} 
+0

感謝尼婭爲此:) – Hendrx

+0

不客氣。如果這是你想要的,接受答案 –

1

請記住,在您替換位圖或當它不再可見時調用Bitmap.recycle()。 創建多個位圖不是問題,但留下未使用的對象而不使用回收來釋放內存。

+0

是的,我知道,但我認爲它應該可以同時顯示10位圖,然後再回收它們。並開始滯後在我顯示的第一個位圖,所以我不認爲我的問題與回收功能有關 – Hendrx

+0

在初始狀態下位圖的大小是多少? – Farasy