Измерьте размер (память) Drawable - PullRequest
1 голос
/ 03 мая 2011

Моя первоначальная проблема заключалась в том, что я загружал файл JPEG размером 1,3 МБ и устанавливал его в качестве изображения. Это привело к исключениям нехватки памяти. Видимо, теперь сервер изменяет размер фотографии, прежде чем я ее скачать. Однако я все еще получаю ожидания ООМ. Какой самый простой способ измерить размер загружаемого файла?

РЕДАКТИРОВАТЬ Я должен также отметить, что это работает нормально на эмуляторе, но падает при работе на G1

    public Drawable getImage() throws IOException, MalformedURLException {
        InputStream is = (InputStream) new java.net.URL(url).getContent();


        return Drawable.createFromStream(is, "name");


}

Ответы [ 3 ]

3 голосов
/ 03 мая 2011

Важны размеры загружаемого / загружаемого изображения. Использование памяти будет примерно шириной * высотой * 2 байта (или * 4 байта, если изображение загружено в 32 бита.) BitmapFactory позволяет считывать размеры изображения без загрузки всего изображения. Вы можете использовать это, чтобы увидеть, насколько большим будет изображение в памяти перед загрузкой.

0 голосов
/ 03 мая 2011

Исключения OOM, вероятно, происходят из-за того, что вы не перерабатываете создаваемые растровые объекты.Когда вы визуализируете изображение (я предполагаю, в ImageView), вы, вероятно, захотите сделать что-то вроде этого:

  ImageView iv;

  // before you update the imageview with the image from the server
  if(iv.getDrawable() != null) ((BitmapDrawable)iv.getDrawable()).getBitmap().recycle();
0 голосов
/ 03 мая 2011

Если вы делаете это через потоки, у каждого дочернего элемента Stream (например, InputStream) есть метод read, который возвращает количество прочитанных байтов.Просто посчитайте эти байты, и вы получите размер вашего изображения.Вот небольшой пример кода:

while ((count = is.read(data)) != -1) { out.write(data, 0 , count); }

Удачи!

...