Как улучшить использование памяти с помощью BitmapFactory.decodebyteArray ()? - PullRequest
0 голосов
/ 30 января 2012

В потоке я извлекаю изображение jpg (из сокета) и помещаю его в байтовый массив datas[]. Затем я делаю растровое изображение и отправляю его своему пользовательскому интерфейсу, чтобы отобразить в виде изображения:

Сторона резьбы:

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 кадров в секунду (больше, если это возможно). Использование опции inPurgeable позволяет мне избежать сбоя OOM (у меня это было до использования inPurgeable), но этого недостаточно. Использование inSampleSize (как объяснено в Странно из-за проблем с памятью ), кажется, не является решением, потому что оно изменяет размер изображения, и мне нужно изображение, которое занимает все пространство изображения.

Как я могу улучшить использование памяти, зная, что я получаю JPG в байтовом массиве, и мне нужно отобразить его в виде изображения?

Примечание: мне не нужно / не нужно изменять размер растрового изображения, полученный jpg уже имеет хороший размер.
Примечание 2: запуск system.gc () после каждого decodeByteArray, кажется, решает эту проблему, но это уродливо, а производительность резко падает

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Использование Parcelable для отправки больших объемов данных в Intents - плохая идея и может привести к снижению производительности.Было бы лучше сохранить изображение в постоянном хранилище и передать URI сохраненному изображению вместо самих данных изображения.

Дополнительная информация по этому вопросу содержится в как передавать изображения (растровые изображения) между действиями Android с использованием пакетов?

0 голосов
/ 08 января 2014

Нет необходимости использовать Bundle, если вы только передаете Сообщение в процессе приложения. Просто передайте свой растровый файл в Message.obj.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...