2011-04-10 134 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