Недостаточно памяти при распределении байтов (битмап как строка для веб-сервиса с использованием мыла)
У меня есть 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!