问题
我的RecyclerView显示带有照片的元素。每张照片都是从互联网上下载的,这可能需要几秒钟的时间。因此,我尝试避免阻止UI线程并将工作传递给Handler,但是,由于RecyclerView的回收行为,它会不正确地显示图像。
这就是它的样子:
将图像1加载到列表项目1。
将图像2加载到列表项目2。
我向下滚动。
将图像3加载到列表项目20。
将图像4加载到列表项目21。
将图像4加载到列表项目20。
将图像5加载到列表项目21。
最后一切都还可以,但在加载过程中,RecyclerView会使用错误的图像回收ViewHolders!
我的代码
mHandler.post(new Runnable() {
@Override
public void run() {
final Uri image = complexFetchingFunction();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
holder.imageView.setImageURI(image);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
});
结束
Handler在单独的线程上工作。这是肯定的。 我知道所有这些事情都会发生,因为我异步加载图像而RecyclerView不喜欢它,但除此之外它很慢。
有没有人有解决方案?
答案 0 :(得分:1)
我建议使用Glide。它将为您异步加载图像,并缓存它们。
举个例子,你可以这样使用它
Glide.with(context)
.load("your_url")
.into(your_imageview);
答案 1 :(得分:1)
来自Android文档 Processing Bitmaps Off the UI Thread
但我建议您使用 UIL 库在recyclerview中加载图片。这是最受欢迎和高效的库,易于集成。
特点:
多线程图像加载(异步或同步)
ImageLoader配置的广泛定制(线程执行器,下载器,解码器,内存和磁盘缓存,显示图像选项等)
每个显示图像调用的许多自定义选项(存根图像,缓存切换,解码选项,位图处理和显示等)
内存和/或磁盘上的图像缓存(设备的文件系统或SD卡) 听力加载过程(包括下载进度)
有关详细信息,请访问https://github.com/nostra13/Android-Universal-Image-Loader
您还可以尝试 GLIDE 。 Glide也支持GIF图像。
您可以比较图片加载器库 here
答案 2 :(得分:1)
使用Glide库。它是Google推荐的图书馆,也可用于各种Google应用,例如Google相册,环聊等。