Picasso如何识别自身在列表Adapter中运行并自动取消旧下载?
Picasso Adapter自动取消下载的核心逻辑
Picasso不需要主动识别是否运行在Adapter中,自动取消前序下载是基于「ImageView与请求绑定」的通用机制实现的,你误解的点是这个特性并非专门为Adapter做的定向适配,只是复用场景刚好匹配该机制的触发条件
- 每个调用
into(ImageView)的请求,都会在目标ImageView上存储一个专属的请求标识Tag,Tag内容包含当前请求的URL、变换参数等唯一特征 - 当同一个ImageView被传入新的
into()调用时,Picasso会先读取该ImageView上已有的请求Tag:- 如果存在未完成的旧请求,直接终止旧请求的下载、解析流程,释放相关资源
- 覆盖旧Tag,绑定新的请求信息,执行新的下载任务
- Adapter的Item复用场景刚好完全匹配该机制的触发条件:列表滚动时,滑出屏幕的Item对应的ImageView会被复用给新滑入的Item,此时新请求调用
into()会自动触发旧请求的取消,完全不需要开发者手动处理复用状态
官方给出的示例代码逻辑对应如下:
@Override public void getView(int position, View convertView, ViewGroup parent) { SquaredImageView view = (SquaredImageView) convertView; if (view == null) { view = new SquaredImageView(context); } String url = getItem(position); Picasso.get().load(url).into(view); }
这里的
convertView就是复用的Item视图,当它是复用时,view可能已经绑定过其他URL的下载请求,into(view)执行时会自动取消之前的下载,避免旧请求完成后把错误的图片设置到当前Item上,同时节省不必要的流量和性能消耗。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

