当前位置: 首页 > news >正文

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource,Kotlin

 

 

import android.graphics.Bitmap
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launchclass MainActivity : AppCompatActivity() {private val TAG = "Glide/${this::class.simpleName}"companion object {const val FAIL = -1const val SUCCESS = 1const val SIZE = 400}private val mCrop = CenterCrop()private val resId = R.mipmap.pic2private var mImageView: ImageView? = nullprivate val mChannel = Channel<Int>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val imageView = findViewById<ImageView>(R.id.image)mImageView = findViewById(R.id.image2)GlideApp.with(this).asBitmap().load(resId).transform(mCrop).override(SIZE, SIZE).addListener(object : RequestListener<Bitmap> {override fun onLoadFailed(e: GlideException?,model: Any?,target: Target<Bitmap>,isFirstResource: Boolean): Boolean {Log.d(TAG, "onLoadFailed")signal(FAIL)return false}override fun onResourceReady(resource: Bitmap,model: Any,target: Target<Bitmap>?,dataSource: DataSource,isFirstResource: Boolean): Boolean {Log.d(TAG, "onResourceReady")signal(SUCCESS)return false}}).into(imageView)waitReceive()}fun signal(s: Int) {lifecycleScope.launch(Dispatchers.IO) {mChannel.send(s)}}private fun waitReceive() {lifecycleScope.launch(Dispatchers.IO) {mChannel.receiveAsFlow().collect {Log.d(TAG, "collect $it")if (it == SUCCESS) {fetchCacheBitmap()}}}}private fun fetchCacheBitmap() {val bitmap = runCatching {GlideApp.with(this@MainActivity).asBitmap().load(resId).transform(mCrop).onlyRetrieveFromCache(true) //从内存或者glide decode好的resource里面取,不去原始decode.override(SIZE, SIZE).addListener(object : RequestListener<Bitmap> {override fun onLoadFailed(e: GlideException?,model: Any?,target: Target<Bitmap>,isFirstResource: Boolean): Boolean {Log.d(TAG, "cache onLoadFailed")return false}override fun onResourceReady(resource: Bitmap,model: Any,target: Target<Bitmap>?,dataSource: DataSource,isFirstResource: Boolean): Boolean {Log.d(TAG, "cache onResourceReady")return false}}).submit().get() //不要在这里加timeout值}.onFailure {Log.d(TAG, "取Glide缓存失败:${it.message}")}.onSuccess {Log.d(TAG, "取Glide缓存成功:${it.byteCount}")}.getOrNull()Log.d(TAG, "getOrNull=${bitmap?.byteCount}")if (bitmap != null) {lifecycleScope.launch(Dispatchers.Main) {//之前的缓存资源取到了。//使用之前的缓存,设置到新的ImageView里面。mImageView?.setImageBitmap(bitmap)}}}
}

 

 

e5c745ea179c4c039a14905391124164.png

可以看到,第一次因为是全新的加载,没有缓存,glide只能干脏活,把原始的图片文件decode成resource,花费200+毫秒,而之后,只从缓存(包括磁盘的resource半成品)中取,仅仅花费20+毫秒,时间开销是原先的约1/10,加载速度相当于快了约10倍。

 

 

 

 

 

Android Glide限定onlyRetrieveFromCache取内存缓存submit超时阻塞方式,Kotlin-CSDN博客文章浏览阅读1.4k次。文章浏览阅读638次。【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。文章浏览阅读353次。kotlin异常处理try-catch-finally_zhangphil的博客-CSDN博客。https://blog.csdn.net/zhangphil/article/details/134051794

 

相关文章:

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…...

EasyExcel实现动态表头功能

EasyExcel实现动态表头功能 开发过程中&#xff0c;大部分都会使用到导出报表功能&#xff0c;目前阶段会用得有 poi导出&#xff08;暂无&#xff09;&#xff0c; easyexcel导出&#xff08;官方文档&#xff0c;https://easyexcel.opensource.alibaba.com/docs/current/&am…...

Python | 安装、环境配置及包的安装

Python | 安装、环境配置及包的安装 一、前言二、python安装及编辑器配置2.1 python安装2.2 python调试2.3 python编辑器 | PyCharm2.3.1 PyCharm下载2.3.2 PyCharm安装2.3.3 PyCharm启动界面2.3.4 PyCharm初步设置2.3.5 PyCharm环境配置(含Python Interpreter配置)2.3.5.1 New…...

CentOS 7 安装 JDK17(注意版本号要与自己的版本一致)

查看是否有自带的 JDK java -versionrpm -qa | grep jdk卸载自带 JDK rpm -e --nodeps [name] # 如 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64查看自带 JDK 是否卸载干净 java -versionrpm -qa | grep jdk在 oracle 官网下载自己所需 JDK 版本&#x…...

JavaScript 数组操作

JavaScript 中的数组提供了各种操作方法&#xff0c;包括增加、删除、修改、查找、排序、遍历、去重和转换等。以下是一些常用的数组操作方法&#xff1a; 增加元素 push(element1, element2, …, elementN): 将一个或多个元素添加到数组的末尾&#xff0c;并返回新数组的长度…...

idea使用lombok编译问题

idea编译报错问题如下&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ解决方案&#xff1a;在idea配置中File->Setti…...

GoLong的学习之路(番外)如何使用依赖注入工具:wire

我为什么要直接写番外呢&#xff1f;其原因很简单。项目中会使用&#xff0c;其实在这里大家就可以写一些项目来了。 依赖注入的工具本质思想其实都大差不差。无非控制反转和依赖注入。 文章目录 控制反转为什么需要依赖注入工具 wire的概念提供者&#xff08;provider&#x…...

【pyspider】爬取ajax请求数据(post),如何处理python2字典的unicode编码字段?

情景&#xff1a;传统的爬虫只需要设置fetch_typejs即可&#xff0c;因为可以获取到整个页面。但是现在ajax应用越来越广泛&#xff0c;所以有的网页不能用此种爬虫类型来获取页面的数据&#xff0c;只能用slef.crawl()来发起http请求来抓取数据。 直接上例子&#xff1a; 可以…...

torch.cumprod实现累乘计算

cumprod取自“cumulative product”的缩写&#xff0c;即“累计乘法”。 数学公式为&#xff1a; y i x 1 x 2 x 3 . . . x i y_ix_1\times{x_2}\times{x_3}\times{...}\times{x_i} yi​x1​x2​x3​...xi​ 官方链接&#xff1a;torch.cumprod 用法&#xff1a; impo…...

设计模式之迭代器模式

什么是迭代器模式 迭代器模式&#xff08;Iterator pattern&#xff09;是一种对象行为型设计模式&#xff0c;它提供了一种方法来顺序访问聚合对象中的元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;同时也可以将迭代逻辑与聚合对象的实现分离&#xff0c;增强了代码…...

使用SSH ,让windows和linux互通

简介 SSH 是一种安全网络协议&#xff0c;旨在让客户端和服务器之间进行安全的数据传输。SSH 的核心思想是利用公钥加密技术和共享密钥加密技术相结合的方式&#xff0c;使客户端和服务器之间建立起安全的连接。 当客户端发起连接请求时&#xff0c;服务器会对客户端进行身份验…...

常用设计模式——策略模式

策略模式是什么 策略模式&#xff08;Strategy&#xff09;&#xff1a;针对一组算法&#xff0c;将每一个算法封装起来&#xff0c;从而使得它们可以相互替换。 比如我们一个软件的会员等级&#xff0c;每一个等级都会有对应的一些等级权益&#xff0c;那么每一个等级权益就…...

牛客网 CM11.链表分割

目录 1.解题思路2.代码实现 1.解题思路 此题目思路相对简单&#xff0c;利用双指针&#xff0c;一个指针指向小于val的&#xff0c;一个指针指向大于等于val的&#xff0c;但实现起来&#xff0c;如果仅仅使用单链表&#xff0c;那么还需特别判断第一个指针是否为空从而特意做…...

[iOS开发]iOS中TabBar中间按钮凸起的实现

在日常使用app的过程中&#xff0c;经常能看到人家实现了底部分栏控制器的中间按钮凸起的效果&#xff0c;那么这是怎么实现的呢&#xff1f; 效果演示&#xff1a; 实现原理&#xff1a; 创建按钮 创建一个UITabBar的子类&#xff0c;重写它的layoutSubviews方法&#xff1…...

数字时代,企业的数据共享意味着什么?

随着数字化整体在社会方方面面的推进&#xff0c;通过数据直接或间接创造的价值越来越大&#xff0c;逐渐成为了构建现代社会的重要要素。而对于企业来说&#xff0c;数据也是在数字经济中容易接触也切实能够利用产生大量价值&#xff0c;所以如何最大化利用数据&#xff0c;让…...

壹[1],QT自定义控件创建(QtDesigner)

1&#xff0c;环境 Qt 5.14.2 VS2022 原因&#xff1a;厌烦了控件提升的繁琐设置&#xff0c;且看不到界面预览显示。 2&#xff0c;QT制作自定义控件 2.1&#xff0c;New/其他项目/Qt4 设计师自定义控件 2.2&#xff0c;设置项目名称 2.3&#xff0c;设置 2.4&#xff0c;设…...

解决Java对接LDAP AD域登录出现Unprocessed Continuation Reference(s)错误

出现该错误的原因&#xff0c;主要是因为Java namingx的库&#xff0c;默认选项是未设置跟随&#xff0c;389返回的是AD域条目的引用&#xff0c;需要进行引用跟随。 解决方法分为两种&#xff0c;第一类不使用全局目录服务的端口389和636&#xff0c;而是使用真实端口 把代码…...

could not read ok from ADB Server

执行adb devices提示 List of devices attached * daemon not running; starting now at tcp:5037 could not read ok from ADB Server * failed to start daemon 方法1&#xff0c;关闭防火墙&#xff0c; could not read ok from ADB Server_夜星辰2023的博客-CSDN博客 我…...

超越基础:Flutter 中 onTap 的 5 条规则让你脱颖而出

小事情决定了你的熟练程度&#xff0c;这些小细节的有趣之处在于它们的丰富性。您将在代码库中的数百个位置遇到 onTap 事件。增强它们可以对代码的可维护性和最终用户体验产生重大的积极影响。 onTap 就是这样一个微小但丰富的东西——我们在每个屏幕上都使用它。这纯粹是关于…...

综合布线可视化管理系统价值分析

传统综合布线管理&#xff0c;全部依靠手工登记&#xff0c;利用标签标示线缆&#xff0c;利用文档资料记录链路的连接和变更&#xff0c;高度依赖网络管理员的管理能力&#xff0c;维护效率低下。同时&#xff0c;网络接入故障和非法接入难以及时发现。在以往的文章中小编一直…...

【Python实战】AI自动整理文件:告别桌面混乱

用PythonAI打造一个桌面文件整理助手&#xff0c;让混乱的桌面瞬间清爽 一、痛点&#xff1a;桌面文件的"灾难现场" 我的桌面曾经是这样的&#xff1a; 截图、下载文件、临时文档混在一起 找文件要翻半天 重要文件被淹没在垃圾文件里 手动整理太麻烦&#xff0c;坚持…...

Qwen-Image-Layered快速部署:ComfyUI镜像一键启动与配置

Qwen-Image-Layered快速部署&#xff1a;ComfyUI镜像一键启动与配置 1. 引言&#xff1a;图像分层的革命性突破 1.1 传统图像编辑的痛点 在常规的图像处理流程中&#xff0c;我们常常遇到一个根本性难题&#xff1a;图像一旦生成或拍摄完成&#xff0c;就变成了一个"不…...

APK-Installer终极指南:三步在Windows上轻松安装Android应用

APK-Installer终极指南&#xff1a;三步在Windows上轻松安装Android应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过在Windows电脑上直接运行Androi…...

如何快速搭建你的专属Galgame社区:TouchGal一站式解决方案完整指南

如何快速搭建你的专属Galgame社区&#xff1a;TouchGal一站式解决方案完整指南 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 你是否…...

python的模块和包

模块&#xff1a;1&#xff1a;在python里一个.py文件就是一个模块&#xff08;module)2&#xff1a;模块可以包含&#xff1a;变量&#xff0c;函数&#xff0c;方法等许多内容3&#xff1a;通常把能够实现特定功能的代码&#xff0c;集中放在一个模块里4&#xff1a;模块可以…...

Android音频设备切换背后的秘密:AudioPolicyService与HAL交互全解析

Android音频设备切换机制深度解析&#xff1a;从AudioPolicyService到HAL的完整链路 在移动设备的多媒体体验中&#xff0c;音频设备切换的流畅性直接影响用户体验。当用户插入耳机、连接蓝牙设备或切换扬声器时&#xff0c;系统如何在毫秒级完成音频路由的重构&#xff1f;本文…...

STM32C8T6+AS608指纹模块实战:从接线到代码调试的全流程避坑指南

STM32C8T6AS608指纹模块实战&#xff1a;从接线到代码调试的全流程避坑指南 指纹识别技术正逐渐渗透到日常生活的各个角落&#xff0c;从手机解锁到门禁系统&#xff0c;这项技术为我们提供了便捷与安全的双重保障。对于嵌入式开发者而言&#xff0c;将指纹识别功能整合到自己的…...

突破可视化边界:Charticulator重新定义数据叙事的技术实践

突破可视化边界&#xff1a;Charticulator重新定义数据叙事的技术实践 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 在数据可视化领域&#xff0c;传统工具往往…...

华为OD机考双机位C卷 - 数字游戏 (Java)

# 数字游戏 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录(Java)点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(Java题解) 题目描述 小明玩一个游戏。 系统发1+n张牌,每张牌上有一个整数。 第一张给…...

炸锅!Claude Code 完整源码意外泄露,51 万行核心代码直接开源!

突发&#xff01;Claude Code 意外开源 51 万行源码全网曝光 2026 年 3 月 31 日&#xff0c;AI 圈迎来重磅事件 ——Anthropic 旗下 Claude Code 因 npm 配置失误&#xff0c;通过 source map 文件意外泄露全部源码&#xff0c;超 1900 个文件、51.2 万行 TypeScript 代码公开…...