我使用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
}
}
答案 0 :(得分:1)
下载它们时,您的图像可能很大。当JPG压缩时,800 x 600像素的单个图像将小于100kb。但是,当您将其解码为位图时,它将变为大约。 2MB的数据。当您加载80本书时,您很快就会获得160MB的数据。 Mabye你应该加载较少的书籍(20)或减少服务器上图像的大小。
通常,logcat会打印一个Exception,它会显示导致OutOfMemoryException的原因。当我得到这个例外时,它总是由一次太大或太多的图片引起。