Пытаюсь сделать бесконечный скролл - думал, что как в 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 при превышении количества картинок определённого числа, но это не помогает. Или нужно вообще иначе делать?