如何使用BitmapFactory.decodebyteArray()提高内存使用率?

时间:2012-01-30 14:55:06

标签: android memory bitmap memory-management

在一个线程中,我正在获取jpg图像(来自套接字)并将其放入字节数组datas[]中。 然后我创建一个位图并将其发送到我的ui以在imageview中显示它:

线程方:

bundle.putParcelable("image", BitmapFactory.decodeByteArray(this.datas, 0, jpgSize,this.bitmapOption));
message.what = ThreadMessages.MSG_IMAGE_AVAILABLE;
message.setData(bundle);
this.uiHandler.sendMessage(message);

位图选项定义如下:

this.bitmapOption = new BitmapFactory.Options();
this.bitmapOption.inPurgeable = true;

ui方面:

cameraView.setImageBitmap((Bitmap) bundle.getParcelable("image"));

据我所知,它在Android 2.x和4.0.x手机上运行良好。但是我用galaxyTab 8.9(android 3.1)进行了一些测试,由于内存使用率很高,我的活动被系统杀死了:

01-30 14:12:02.311: I/ActivityManager(72): Process my.package (pid 1175) has died.
01-30 14:12:02.321: I/WindowManager(72): WIN DEATH: Window{41140848 my.package/my.package.DisplayOneCam paused=false}
01-30 14:12:02.331: I/WindowManager(72): WIN DEATH: Window{410f5020 my.package/my.package.main paused=false}
01-30 14:12:02.331: I/WindowManager(72): WIN DEATH: Window{41033308 my.package/my.package.DisplayCameras paused=false}
01-30 14:12:02.371: I/ActivityManager(72): Start proc my.package for activity my.package/.DisplayCameras: pid=1209 uid=10036 gids={3003, 1015}
01-30 14:12:02.371: I/ActivityManager(72): Low Memory: No more background processes.
01-30 14:12:02.391: I/WindowManager(72): WINDOW DIED Window{410f5020 my.package/my.package.main paused=false}

获取的位图不是非常高的分辨率图像(最大800 * 600),但至少以10 fps显示(如果可能,则显示更多)。 使用inPurgeable选项可以避免OOM崩溃(我在使用inPurgeable之前使用它)但似乎不够。 使用inSampleSize(如Strange out of memory issues中所述)似乎不是一个解决方案,因为它调整了图像的大小,我需要一个占据图像视图整个空间的图像。

如果知道我在字节数组中收到jpg并且需要在imageview中显示它,我怎样才能提高内存使用率?

注意:我不需要/想要调整位图的大小,收到的jpg已经很好了 注2:在每个decodeByteArray之后触发system.gc()似乎解决了问题,但它很丑陋,性能急剧下降

2 个答案:

答案 0 :(得分:2)

使用Parcelable在Intent中发送大量数据是一个坏主意,可能会导致性能不佳。最好将图像存储到持久存储中,并将URI传递给存储的图像而不是图像数据本身。

how do you pass images (bitmaps) between android activities using bundles?

中有更多相关信息

答案 1 :(得分:0)

如果您只是在申请流程中传递消息,则无需使用Bundle。只需在Message.obj中传递您的位图。