2012-01-05 60 views
0

由於報告中沒有評論我發生崩潰時我的遊戲部分正在播放的內容,但我沒有足夠的信息,站立,應該不可能得到這個錯誤。通過堆棧跟蹤報告發送的Android回收位圖崩潰

這是堆棧跟蹤:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap   
[email protected] at 
android.graphics.Canvas.throwIfRecycled(Canvas.java:955) at 
android.graphics.Canvas.drawBitmap(Canvas.java:1044) at 
bladequest.graphics.DrawObject.render(DrawObject.java:81) 

我得到的錯誤,說正在在某些時候使用的程序回收位圖從列77和81(單獨的蹤跡)

然而,在這裏是我的代碼爲這些行:

case Bmp1: 
     if(bmp != null && !bmp.isRecycled()) 
      canvas.drawBitmap(bmp, f1, f2, p); 
     break; 
    case Bmp2: 
     if(bmp != null && !bmp.isRecycled()) 
      canvas.drawBitmap(bmp, r1, r2, p); 
     break; 

它甚至有可能是一個回收的位圖曾經使它的繪製調用?

+0

你有原因在釋放它的某個時刻設置bmp = null的選項?或者,您可能希望在釋放垃圾時手動收集垃圾。 – 2012-01-05 02:38:33

回答

0

也許onDraw方法被調用,如果你要回收的位圖,並避免出現此錯誤,建議重寫onDraw方法,在OnDraw中,你需要檢查 bmp != null && !bmp.isRecycled()

+0

我提出的問題是另一個線程正在回收位圖,然後才能繪製。基本上位圖被放入一個對象中,該對象被放入一個與遊戲數據並行繪製屏幕的drawqueue中....所以在非常罕見的情況下,更新線程在檢查它是否被回收之前但是之前正在回收位圖它的繪製......現在如何解決:( – P4r0dy 2012-01-05 04:36:45

+1

如果有更多的線程來操作這個位圖,你可以定義一個易變的布爾變量來檢查,例如: 'volatile boolean recycled = false;' 當你回收,'回收= true', 當繪製時,檢查回收。 也,不要回收在另一個線程,使回收在UI線程中,您可以發送一個回收消息給UI線程 – idiottiger 2012-01-05 04:40:34

+0

是啊我是實施一個應該清除這個混亂的變化,謝謝你的幫助:D – P4r0dy 2012-01-05 04:51:06