2011-04-10 48 views
1

我是新來開發android應用程序。我正在製作一個簡單對象移動的應用程序。問題與背景有關。當我把這樣的代碼:背景圖片減慢Android應用程序

protected void onDraw(Canvas canvas) { 
    BackGround1 = BitmapFactory.decodeResource(getResources(), R.drawable.lightning1); 
    canvas.drawBitmap(BackGround1, 0, 0, null); 
    canvas.drawCircle(xp, yp, circleRadius, circlePaint); 
} 

運動物體(圈子)減慢顯著,一段時間後(如20秒),那裏開始出現從圈,之後的痕跡(約10秒),它「崩潰「並回到之前的活動。

如果我把
canvas.drawColor(Color.BLACK);
而不是
canvas.drawBitmap(BackGround1, 0, 0, null);然後一切工作正常。 lightning1是480x800 jpg圖片。
誰能告訴我我做錯了什麼?

04-11 02:00:50.722: ERROR/dalvikvm-gc(13262): Could not create 1097728-byte ashmem mark stack: Too many open files 
04-11 02:00:50.722: ERROR/dalvikvm-heap(13262): dvmHeapBeginMarkStep failed; aborting 
04-11 02:00:50.722: ERROR/dalvikvm(13262): VM aborting 
04-11 02:00:50.902: ERROR/ActivityManager(92): fail to set top app changed! 
+0

如果發生崩潰,請發佈logcat。 – user432209 2011-04-10 22:52:05

+0

04-11 02:00:50.722:ERROR/dalvikvm-gc(13262):無法創建1097728字節的ashmem標記堆棧:打開的文件過多 04-11 02:00:50.722:ERROR/dalvikvm-heap(13262 ):dvmHeapBeginMarkStep失敗;正在中止 04-11 02:00:50.722:錯誤/ dalvikvm(13262):VM正在中止 04-11 02:00:50.902:錯誤/ ActivityManager(92):無法設置頂級應用程序已更改! ,那是我認爲的錯誤代碼 – randomUser56789 2011-04-10 23:04:50

回答

2

您正在解碼資源,每次繪製表面時。這會創建許多新的對象,並且Android有足夠的工作來運行垃圾收集器,以便在您之後進行清理。

您可能只想加載一次資源,並將其存儲在一個字段中。

從更一般的意義上說,您可以隨時查看Logcat,找出導致力量接近的原因。我假設你得到OutOfMemoryException

+0

我不認爲他正在創建任何新對象。他一遍又一遍地分配了BackGround1,但他說他正在創建許多新的位圖是不正確的。 – user432209 2011-04-10 22:55:13

+0

[BitmapFactory.decodeResourceStream文檔](http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeResource%28android.content.res.Resources,%20int,%20android.graphics.BitmapFactory。選項%29)指出:「解碼來自InputStream的新位圖」。 – 2011-04-10 22:59:14

+0

是的,我想這是製造太多的物體或類似的東西。把這個塊解決的問題:BackGround1 = BitmapFactory.decodeResource(getResources(),R.drawable.lightning1); 在課程開始時從該方法中移除。謝謝你們的幫助。 – randomUser56789 2011-04-10 23:12:46