LINUX.ORG.RU

Освобождение памяти для BitmapFactory.decodeStream

 ,


0

1

Пытаюсь сделать бесконечный скролл - думал, что как в iOS, при использовании ArrayAdapter для ListView, отрисовывается только то, что на экране. Но, похоже, удаление из памяти проскролленного вверх нужно делать вручную. Делаю читалку для сайта - при достижении края экрана в AsyncTask с помощью jsoup получаю очередную страницу с картинками и выдираю из неё список их url. Затем для каждого url создаётся Bitmap:

for (int i =0; i < imageElements.size(); i++) {

                    Element image = imageElements.get(i);
                    String imageId = image.attr("src");
                    Bitmap bmp = null;
                    bmp = mCache.getBitmapFromDiskCache(imageId);
                    if(bmp == null)
                    {
                        URL imageUrl = new URL(imageId);

                        bmp = BitmapFactory.decodeStream(imageUrl.openConnection().getInputStream());//out of memory exception
                        BitmapDrawable d = new BitmapDrawable(getResources(), bmp);
                        mCache.addBitmapToCache(imageId, d);
                    }
                    images.add(bmp);
                }

После того, как объём загруженного таким образом при очередном скролле превышает определённый объём выбрасывается exception:

Caused by: java.lang.OutOfMemoryError: Failed to allocate a 2306412 byte allocation with 1336365 free bytes and 1305KB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
            at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649)

Полученные объекты Bitmap хранит у себя адаптер листа. Можно ли как-то принудительно очистить память, занятую прошлыми вызовами decodeStream? Пробовал делать recycle при превышении количества картинок определённого числа, но это не помогает. Или нужно вообще иначе делать?

★★★★

Не загружай картинки все сразу. Лучше всего просто воспользуйся какой-нибудь библиотекой (я использую Universal Image Loader) и не забывай про паттерн View Holder.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.