android在应用程序中预先分配内存

android在应用程序中预先分配内存,android,performance,Android,Performance,我编写了从给定字节数组创建位图的代码。下面是示例代码: Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(imgData)); 然而,这需要大约15-20毫秒。类似地,在android应用程序中,可能还有其他操作需要花费时间。在adb logcat中,我看到GC_ALLOC_FREE…暂停14ms,堆大小不断增大

我编写了从给定字节数组创建位图的代码。下面是示例代码:

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(imgData));
然而,这需要大约15-20毫秒。类似地,在android应用程序中,可能还有其他操作需要花费时间。在adb logcat中,我看到GC_ALLOC_FREE…暂停14ms,堆大小不断增大等等

我的问题是:有没有一种方法可以在android应用程序中预先分配内存,从而避免GC被多次调用?我在网上搜索了一下,我知道通常游戏应用程序都是为了性能优化而这样做的,但却找不到一个例子来说明如何做到这一点

编辑: 根据下面的建议,我将'bm'作为成员变量并创建ByteBuffer对象

Bitmap bm = bm.createBitmap(width, height, Bitmap.Config.ARGB_8888);
ByteBuffer bb = ByteBuffer.allocate(<length>);
然而,它给了我同样的结果,我仍然看到GC_FOR_ALLOC freed…暂停了15毫秒


此外,上面的行代码在侦听器方法中被调用,并将“数据”作为参数获取

为什么不使用创建位图?然后它会自动为你做一切。您还可以查看该方法的扩展版本,该版本允许您提前设置宽度、高度和其他参数。

编辑的代码实际上是正确的,但是,我在代码的其他部分生成了一些字节数组,这使得GC很难工作


@CommansWare:你的回答为我指明了正确的方向。谢谢。

嗯。。。只是不要放弃对象,这样它就不会被垃圾收集,而是重新使用它。如果需要任意数量的对象,请使用对象池。我遗漏了什么吗?@commonware请查看上面编辑的问题。可能值得使用DDMS分配跟踪程序查看分配的内容。
bitmap.copyPixelFromBuffer(bb.put(data));