导航网站制作 zhihu,企业免费建站网站,产品宣传片公司,门户网站设计欣赏需求
假设此时已经用load指定一个url: String#xff0c;又用into指定了一个img: ImageView开始加载#xff0c;但是网络突然中断#xff0c;导致图片加载失败。在这种情况下#xff0c;想要通过点击一个Button重新加载。
Glide.with(context).load(url).placeholder(loa…需求
假设此时已经用load指定一个url: String又用into指定了一个img: ImageView开始加载但是网络突然中断导致图片加载失败。在这种情况下想要通过点击一个Button重新加载。
Glide.with(context).load(url).placeholder(loadingBitmap).into(img) // 失败后将保持 loadingBitmap分析1
自然的想法是直接添加一个按钮在失败时重复执行加载过程
button.setOnClickListener {Glide.with(context).load(url).placeholder(loadingBitmap).into(img) // 失败后将保持 loadingBitmap
}但是这样做每次点击按钮都会重新执行一遍Glide的构建流程浪费处理资源。
分析2
在Glide处理时增加一个监听器只有onLoadFailed亦即加载失败时才将按钮设为可点击并且撤销之前的监听器。同时为按钮增加一个监控变量确保其只被点击了一次避免重复加载退化为分析1。 代码比较复杂这里略去不写。
分析3
实际上Glide自身存在控制资源重新加载的方式即Target。因此不需要任何重初始化只要调用Target的相关函数刷新加载请求即可。
解决方案
将分析3编写为一个简单的类如下。
class RequestReloadingButtonListenerT(private val button: Button) : RequestListenerT {var mTarget: TargetT? nullinit {button.apply { post {setOnClickListener { mTarget?.request?.apply {clear() // 取消上次请求begin() // 异步开始新请求} }} }}override fun onLoadFailed(e: GlideException?,model: Any?,target: TargetT,isFirstResource: Boolean): Boolean {button.visibility View.VISIBLE // 显示重加载按钮mTarget target // 记录请求目标return false}override fun onResourceReady(resource: T Any,model: Any,target: TargetT?,dataSource: DataSource,isFirstResource: Boolean): Boolean {button.visibility View.GONE // 隐藏重加载按钮return false}
}这样一来通过如下代码即可实现加载失败时显示重加载按钮用户点击后重新加载
Glide.with(context).load(url).placeholder(loadingBitmap).addListener(RequestReloadingButtonListener(button)).into(img)