安卓Glide加载失败时点击按钮重新加载图片

需求

假设此时已经用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 RequestReloadingButtonListener<T>(private val button: Button) : RequestListener<T> {var mTarget: Target<T>? = nullinit {button.apply { post {setOnClickListener { mTarget?.request?.apply {clear()		// 取消上次请求begin()		// 异步开始新请求} }} }}override fun onLoadFailed(e: GlideException?,model: Any?,target: Target<T>,isFirstResource: Boolean): Boolean {button.visibility = View.VISIBLE	// 显示重加载按钮mTarget = target					// 记录请求目标return false}override fun onResourceReady(resource: T & Any,model: Any,target: Target<T>?,dataSource: DataSource,isFirstResource: Boolean): Boolean {button.visibility = View.GONE		// 隐藏重加载按钮return false}
}

这样一来,通过如下代码即可实现加载失败时显示重加载按钮,用户点击后重新加载:

Glide.with(context).load(url).placeholder(loadingBitmap).addListener(RequestReloadingButtonListener(button)).into(img)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从PDF到高清图片:一步步学习如何转换PDF文件为高清图片

引言 PDF文件是一种便携式文档格式&#xff08;Portable Document Format&#xff09;&#xff0c;最初由Adobe Systems开发&#xff0c;用于在不同操作系统和软件之间保持文档格式的一致性。PDF文件通常包含文本、图片、图形等多种元素&#xff0c;并且可以以高度压缩的方式存…

VScode 集成终端设置默认打开当前文件夹 mac系统

一.快捷键设置 搜索 openInIntegratedTerminal 如图&#xff1a; 二.设置cmd 默认打开位置 点击设置 搜索 ntegrated:cwd 如下图&#xff1a; 三.查看ip 快捷指令&#xff1a; ipconfig getifaddr en0

ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法

前言 默认 SD 卡分区是 FAT32 格式&#xff0c;为了用于嵌入式Linux ext4 文件系统&#xff0c;需要改为 ext4 文件系统&#xff0c;但是SD 卡分区类型默认是 msdos 类型&#xff0c;也就是 MBR 类型&#xff0c;不是 GPT 类型。 烧写 ext4 分区表&#xff0c;或者使用 ubuntu…

linxu tensorflow-1.13.1 C++动态库编译

1、版本要求 版本 Python 版本 编译器 编译工具 tensorflow-1.13.1 2.7、3.3-3.6 GCC 4.8 Bazel 0.19.2 tensorflow-1.12.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 tensorflow-1.11.0 2.7、3.3-3.6 GCC 4.8 Bazel 0.15.0 tensorflow-1.10.0 …

SpringBoot中Bean注册

Bean注解 Springboot中默认扫描启动类所在的包及其子包。 比如这里的DemoApplication是启动类&#xff0c;那么spring boot默认扫描com.example.demo这个包。 Controller、Service、Repository这三个注解是Component的衍生注解&#xff0c;它们经常会被添加到Controller层、Se…

什么是EDM邮件推广营销?

电子邮件作为最古老的互联网沟通工具之一&#xff0c;凭借其无可比拟的直达性、个性化潜力与高投资回报率&#xff0c;始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用&#xff0c;云衔科技以其前瞻视野与深厚技术底蕴&#xff0c;倾力打造了一站式智能EDM邮件营…

机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用&#xff0c;结合生活中的生动例子帮助大家理解。GaussianNB&#xff0c;即高斯朴素贝叶斯模型&#xff0c;是一种基于概率论的分类算法&#xff0c;广泛应…

免杀对抗-安全工具篇新型Go架构C2-Sliver多平台上线模式红队集成研究免杀方向

首先&#xff0c;你需要分析&#xff1a; 1、安全工具是否有源代码 2、安全工具源代码逻辑复杂程度 3、当前源代码你是否有能力修改 其次&#xff0c;你需要考虑&#xff1a; 1、无源码或无能力修改 2、各种异常bug打包问题 3、修改打包后效果也不太好 故&#xff1a; 1、非源码…

VScode使用Prettier格式化代码

1、安装Prettier插件 2、扩展设置 3、设置.prettierrc.json配置文件路径 4、.prettierrc 配置文件 .prettierrc.json 是 Prettier 格式化工具的配置文件&#xff0c;用于指定代码格式化的规则和风格。下面是一些可能的配置选项&#xff0c;请自行选择&#xff1a; {"prin…

MetaGPT部分源码解读--Memory

storage: list[SerializeAsAny[Message]] []index: DefaultDict[str, list[SerializeAsAny[Message]]] Field(default_factorylambda: defaultdict(list))ignore_id: bool False storage 属性是一个列表&#xff0c;用于存储消息对象。每个消息对象都被标记为 SerializeAsAn…

Yarn与Zookeeper的介绍

Yarn--三大调度策略 FIFO(先进先出): 目前几乎已经没有人使用了. 类似于: 单行道. 好处: 每个计算任务能独享集群100%的资源. 弊端: 不能并行执行, 如果大任务过多, 会导致小任务执行时间过长. Capacity(容量调度): 我们用…

找到矩阵中位于降序15%位置的值

MATLAB实现 clc clearvars; matrix randn(10, 10); % 一个示例矩阵 disp(matrix)value find_value_at_15_percent(matrix); disp([位于降序中15%位置的值为: , num2str(value)]);% 验证 xreshape(matrix,1,100); ysort(x,descend); y(1:16)function value_at_15_percent fi…

缓存(反向代理)服务器-varnish

varnish简介&#xff1a; varnish是一款高性能且开源的反向代理服务器和HTTP加速器&#xff0c;&#xff08;其实就是带缓存的反向代理服务器&#xff09;它可以把整个HTTP响应内容缓存到内存或文件中&#xff0c;从而提高web服务器器的响应速度。 与传统的squid相比&#xff0…

【Java后端开发】教程及案例

Java后端开发是软件开发中的一个重要领域&#xff0c;它涉及到服务器端的程序设计、数据库交互、API开发、安全性处理等多个方面。以下是关于Java后端开发的教程和案例的详细介绍&#xff1a; ### Java后端开发基础 #### 1. Java基础知识 - 掌握Java基础语法、面向对象编程、…

压测Nginx时对Linux内核参数优化,以支持更高的并发

文章目录 Linux内核参数优化参数意义解析注意事项 Linux内核参数优化 编辑/etc/sysctl.conf文件 fs.file-max 999999 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_fin_timeout 30 net.ipv4.tcp_max_tw_buckets 5000 net.ipv4.ip_local_port_…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前&#xff0c;我们需要了解什么是dpi分辨率&#xff0c;简单来说&#xff0c;分辨率是指图像中包含的像素数量&#xff0c;分辨率越高&#xff0c;图像就越清晰&#xff0c;常见的分辨率包括72dpi、96dpi和300dpi等&#xff0c;在打印照片或者一些考试平台对图片…

02-JDK新特性-泛型

泛型 什么是泛型 泛型是JDK5中引入的特性&#xff0c;它提供了编译时类型安全检测机制&#xff0c;该机制允许在编译是检测到非法的类型。 它的本质是参数化类型&#xff0c;也就是说操作的数据类型被指定为一个参数。 也就是将类型有原来的具体类型参数化&#xff0c;然后在…

【CVE复现计划】CVE-2023-27179

CVE-2023-27179 简介&#xff1a; GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞&#xff0c;漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。 影响版本&#xff1a; GDidees CMS v3.9.1及更低版本 POC: /_admin/imgdownload.php?filename/fla…

2024蓝桥杯每日一题(树形DP)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;病毒溯源 试题二&#xff1a;没有上司的舞会 试题三&#xff1a;生命之树 试题一&#xff1a;病毒溯源 【题目描述】 病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株&#xff0c;而…