Недостаточно памяти при распределении байтов (битмап как строка для веб-сервиса с использованием мыла)

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

Для преобразования bitmap в строку am с помощью:

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

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

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

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

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

com.sun.jdi.InvocationException occurred invoking method.

on soaprequest.

Как решить эту проблему и upload image в webservice как строку?

Ответ 1

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

bitmap.recycle();

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

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

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

stream.close();
stream = null;

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

Ответ 2

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

Попробуйте использовать размер без изменений с помощью

BitmapFactory.decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options выбирает)

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

Ответ 3

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

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

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