Недостаточно памяти для распределения байтов (Bitmap как String для веб-службы с использованием мыла) - PullRequest
11 голосов
/ 10 ноября 2011

У меня bitmap, поэтому я хочу загрузить строку webserivceas и получить эту строку.

Для преобразования растрового изображения в строку я использую:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

strBase64 = Base64.encodeToString(byteArray, Base64.URL_SAFE);

это выше String использует как свойство to в soapobject для загрузки.

Но я получаю Out of memory on a 11674900-byte allocation при печати и загрузке.

И если я отладил проблему, без печати я получаю

com.sun.jdi.InvocationException occurred invoking method.

на soaprequest.

Как решить эту проблему и upload image для веб-службы в виде строки?

Ответы [ 3 ]

9 голосов
/ 10 ноября 2011

Вы создаете 3 копии образа размером 11 МБ (bitmap, stream, strBase64).Поэтому уменьшите использование памяти, вызвав

bitmap.recycle();

ниже этой строки:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);

Также закройте поток, когда закончите с ним (ниже stream.toByteArray();):

stream.close();
stream = null;

Помните, что нет гарантии, что память будет очищена сразу после этих вызовов .Правильный способ справиться с ситуацией такого типа - передавать куски больших файлов порциями.

0 голосов
/ 09 апреля 2013

Некоторым простым решением может быть добавление android: configChanges = "Ориентация | screenSize" в манифест.В моем случае эмулятор Nexus_S зависал без этой строки, в то время как само устройство Nexus 7, на котором я тестировал, не зависало при ротации.

Добавление этого, по-видимому, легко исправить для приложений, имеющих парубольшие "match_parent" растровые изображения для поворота и изменения размера.

Осторожно, если вы создаете API до 13!

0 голосов
/ 13 апреля 2012

Распределение байтов в 11 миллионов, намного больше, чем может вместить большинство телефонов. Вы определенно не хотите хранить в памяти байтовый массив такого размера.

Попробуйте использовать размер выборки с

BitmapFactory.decodeStream (InputStream есть, Rect outPadding, BitmapFactory.Options опций)

и параметры настройки для использования размера выборки для возврата изображения разумного размера.

...