Glide在recyclerView中同时开启线程问题

glide全局是一个单例的存在,利用with()方法根据传递的context与界面关联感知生命周期,如果在非主线程中执行glide操作,会传入一个application的context对象,感知的生命周期是整个程序的周期。
在主线程中,如果传入的是activity的context,由于glide感知到不到activity的生命周期会在当前的activity中生成一个隐藏的fragment来与当前界面进行生命周期的绑定。当然传入的是fragment的话,就不用新建这个隐藏的fragment.

问题:在recyclerview中,每个item有一个glide加载图片的问题,每次glide加载图片会异步利用线程池开启一个访问,但是当用户在滑动是,复用的item并没有加载上次异步的请求网络缓慢导致的图片混乱问题,怎么理解?

原因:Glide将加载请求和Target(ImageView)关联,开始某个ImageView的加载请求前会先将该ImageView关联的请求清除。此时在线程池中的关联的DecodeJob,正在进行的网络请求不会被中断,在等待队列里的也不会被直接从线程池移除,而是移除回调并设置取消标志位,让未开始的后续加载步骤的逻辑不会被执行。
当列表(ListView/RecyclerView)快速滚动时,同时执行的网络请求数量不会超过设备可用核心数,其余请求会放到队列中等待执行。虽然队列长度可能会一下增加到几十,但随着列表复用View,队列中的大部分请求都会被取消掉,之后执行时不会发起网络请求,并迅速让位于等待中的请求。也就是说,快速滚动过程的中间很多个列表项的请求都会被略过。这样的机制保证了不会过度消耗资源导致滑动卡顿与图片混乱问题

你可能感兴趣的:(Glide在recyclerView中同时开启线程问题)