我在Android中播放视频,我在本机代码中解码帧,然后将像素复制到位图,然后使用canvas.unlockandpost以及所有位图的while循环在Java中显示位图。
一切都很好,但位图的流式传输非常缓慢并导致崩溃。我只在logcat上看到一条消息,说“低内存不再有后台进程”。
我在eclipse的分配表上看到,我创建的位图没有从内存中删除,即使我每次都覆盖像素。有什么方法可以清理它所保留的记忆。
我的代码如下。
C代码:
AndroidBitmapInfo info;
void* pixels;
int ret;
if ((ret =AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
}
memcpy(pixels, pictureRGB, 480*320);
AndroidBitmap_unlockPixels(env, bitmap);
Java代码
Bitmap mBitmap = Bitmap.createBitmap(480, 320, Bitmap.Config.RGB_565);
renderbitmap(mBitmap, 0);
canvas.drawBitmap(mBitmap, 0, 0, null);
答案 0 :(得分:1)
您的问题中显示的代码缺少一些关键部分来完全理解您的问题,但听起来您正在为每个帧创建一个新的位图。由于Android仅为每个Java VM分配大约16MB的分配,因此您的应用程序将在大约52帧后被杀死。您可以创建一次位图并重复使用多次。更确切地说,您正在创建一个位图(Bitmap.CreateBitmap),但不会销毁它(Bitmap.recycle)。这将解决您的内存泄漏,但仍然不是处理它的最佳方式。由于位图大小不会更改,因此在您的活动开始时创建一次,并在活动的整个生命周期中重复使用它。