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,队列中的大部分请求都会被取消掉,之后执行时不会发起网络请求,并迅速让位于等待中的请求。也就是说,快速滚动过程的中间很多个列表项的请求都会被略过。这样的机制保证了不会过度消耗资源导致滑动卡顿与图片混乱问题

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,515评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,314评论 25 709
  • 【Android 库 Glide】 引用 Android图片加载框架最全解析(一),Glide的基本用法Andro...
    Rtia阅读 11,000评论 0 22
  • 前段时间帮朋友弄了一套Android自动售卖机的App,主要工作流程就是用户在自动售卖机的屏幕(App)上...
    codeRL阅读 10,062评论 4 10
  • 善于写出那些能表现自己人格、品质魅力的经历 是否具有特殊的经历、优秀的人格品质以及良好的性格,已经成为当今许多用人...
    上班下班打卡要准时阅读 4,655评论 1 18

友情链接更多精彩内容