在具有无限卷轴的列表视图中使用Volley ImageLoader时出现内存不足错误

时间:2016-02-14 11:15:00

标签: android listview android-volley

我使用ListView显示使用Google API的图书清单。我使用Volley ImageLoader加载了最多40本带书籍封面的书籍。它工作正常。

然后今天我决定在我的列表视图中添加一个无限滚动条,每次滚动到底部时都会加载40本下一本书。问题是,在加载了大约80本书后,我的内存出错了。

如果我只是注释掉ImageLoader部分,我可以毫无问题地向下滚动到数千个。

所以我不确定是什么导致了内存错误问题,以及如何解决这个问题。任何帮助将受到高度赞赏。

仅供参考,我使用Singletone加载imageLoader

ImageLoader方法(在ListView适配器内)

private ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
    private LruCache<String, Bitmap> cache = new LruCache<>((int)Runtime.getRuntime().maxMemory()/1024/8);
    @Override
    public Bitmap getBitmap(String url) {
        return cache.get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        cache.put(url, bitmap);
    }

});
imageLoader.get(urlThumb, new ImageLoader.ImageListener() {
    @Override
    public void onResponse(ImageLoader.ImageContainer response, boolean b) {
        holder.thumb.setImageBitmap(response.getBitmap());
    }
});

无限滚动

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    if(!_loading && (totalItemCount - firstVisibleItem - visibleItemCount) < 5){
        _loading = true;
        // LOAD NEXT 40
    }
}

1 个答案:

答案 0 :(得分:1)

下载它们时,您的图像可能很大。当JPG压缩时,800 x 600像素的单个图像将小于100kb。但是,当您将其解码为位图时,它将变为大约。 2MB的数据。当您加载80本书时,您很快就会获得160MB的数据。 Mabye你应该加载较少的书籍(20)或减少服务器上图像的大小。

通常,logcat会打印一个Exception,它会显示导致OutOfMemoryException的原因。当我得到这个例外时,它总是由一次太大或太多的图片引起。