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

 

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

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

相关文章

Java,面向对象,枚举类

枚举类型本质上也是一种类&#xff0c;只不过这个类的对象是有限的、固定的几个&#xff0c;不能让用户随意创建。 场景&#xff1a; 开发中&#xff0c;如果针对于某个类&#xff0c;它的实例的个数是确定的。则推荐将此类声明为枚举类。 如果枚举类的实例只有一个&#xff0c…

react_11

MobX 介绍 需求&#xff0c;组件0 改变了数据&#xff0c;其它组件也想获得改变后的数据&#xff0c;如图所示 这种多个组件之间要共享状态数据&#xff0c;useState 就不够用了&#xff0c;useContext 也不好用了 能够和 react 配合使用的状态管理库有 MobX Redux 其中…

Java高频面试题——Java基础篇

java基本数据类型及对应的字节数&#xff1f;什么是自动拆装箱&#xff1f;int与integer的区别&#xff1f;项目中如何使用&#xff1f; 1.java基本数据类型及对应的字节数&#xff1f; java总共有8中基本数据类型&#xff0c;整型4种&#xff0c;浮点型2种&#xff0c;字符类…

k8s集群调度

目录 1、理论&#xff1a; 1.1、 概述&#xff1a; 1.2、Pod 是 Kubernetes 的基础单元&#xff0c;Pod 启动典型创建过程如下&#xff1a; 工作机制 **** 1.3、调度过程 *** 1.4、Predicate 有一系列的常见的算法可以使用&#xff1a; ** 1.5、 优先级由一系列键…

docker 常用

系统 Ubuntu 20.04 64位 安装文档 ubuntu&#xff1a;https://docs.docker.com/engine/install/ubuntu/ centos&#xff1a;https://docs.docker.com/engine/install/centos/ debian&#xff1a;https://docs.docker.com/engine/install/debian/ 常用命令 查看镜像 docke…

APP攻防--ADB基础

进入app包 先使用 adb devices查看链接状态 手机连接成功的 adb shell 获取到手机的一个shell 此时想进入app包时没有权限的&#xff0c;APP包一般在data/data/下。没有执行权限&#xff0c;如图 Permission denied 权限被拒绝 此时需要手机root&#xff0c;root后输入 su …

Collection子接口—List接口

Java中数组存储数据具有局限性&#xff0c;我们通常用List替代数组 1.List集合类中元素有序&#xff0c;且可重复(有序&#xff1a;按添加的顺序) 2.ArrayList、 LinkedList、Vector三种实现类 ArrayList.、LinkedList.、Vector的使用&#xff1a; ArrayList的源码分析&#x…

Java通过cellstyle属性设置Excel单元格常用样式全面总结

最近做了一个导出Excel的功能&#xff0c;导出是个常规导出&#xff0c;但是拿来模板一看&#xff0c;有一些单元格的样式设置&#xff0c;包括合并&#xff0c;背景色&#xff0c;字体等等&#xff0c;毕竟不是常用的东西&#xff0c;需要查阅资料完成&#xff0c;但是搜遍全网…

二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统

在现代软件开发中&#xff0c;通知系统是一个广泛应用的功能&#xff0c;用于实时向用户发送各种类型的通知&#xff0c;如短信、微信、邮件以及系统通知。然而&#xff0c;通知系统的需求通常是多变且动态的&#xff0c;因此需要一种灵活可扩展的设计模式来满足不同类型的通知…

ConnectionError: HTTPSConnectionPool

ConnectionError: HTTPSConnectionPool(host‘zbbfxstatic.figtingdream.com’, port443): Max retries exceeded with url: /api/cache (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x00000249795AD9A0>: Failed to establish a ne…

Kubernetes技术与架构-存储 3

如上所示&#xff0c;Kubernetes集群的存储层支持不同类型的存储资源&#xff0c;其提供Projected类型的存储功能整合多种存储资源&#xff0c;将secret、downwardAPI、configMap三种不同类型的存储资源整合成一个挂载到Pod的容器实例中 如上所示&#xff0c;整合两个secret类型…

Spring集成高性能队列Disruptor

Disruptor简介 Disruptor&#xff08;中文翻译为“破坏者”或“颠覆者”&#xff09;是一种高性能、低延迟的并发编程框架&#xff0c;最初由LMAX Exchange开发。它的主要目标是解决在金融交易系统等需要高吞吐量和低延迟的应用中的并发问题。 Disruptor特点 无锁并发&#x…

Ubuntu定时执行日志备份及删除脚本

第一步编写脚本文件 创建并编辑 log_bash.sh&#xff0c;并赋予脚本可执行权限 chmod X log_bash.sh # !/bin/bash# 备份路径 backup_dir"/root/test/backup_log" # 日志路径 log_dir"/root/test" log_file"test.log"mkdir -p $backup_dir cd …

【数据结构】单链表详解(超详细)

单链表是我们学习数据结构时必不可少的部分&#xff0c;但也由于指针的参与变得更加复杂&#xff0c;这篇文章学习完之后可以更好地理解与掌握链表结构 注意&#xff1a; 数据结构中&#xff0c;不在乎菜单的创建&#xff0c;注重的是功能的实现&#xff1b;菜单的创建会影响我…

Java之图书管理系统

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家分享一下Java实现一个简易的图书管理系统&#xff01; 清风的个人主页&#x1f389;✏️✏️ &#x1f302;c/java领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&…

旋转图像[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个n n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a; matrix…

后端设计PG liberty的作用和增量式生成

Liberty&#xff08;俗称LIB和DB&#xff09;&#xff0c;是后端设计中重要的库逻辑描述文件&#xff0c;这里边包含了除过physical&#xff08;当然也有一点点涉及&#xff09;以外所有的信息&#xff0c;对整个后端设计实现有非常大的作用。借此机会&#xff0c;一起LIB做一个…

C++中的移动构造函数

C中的移动构造函数 所谓移动语义&#xff0c;指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解&#xff0c;移动语义指的就是将其他对象&#xff08;通常是临时对象&#xff09;拥有的内存资源“移为已用”。 以前面程序中的 demo 类为例&#xff0c;该…

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶&#xff0c;而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快&#xff0c;海量设备产生的数据&#xff0c;若上传到云端进行处理&#xff0c;会对云端造成巨大压力。如果利用边缘计算来让云端的能…

dubbo集群容错策略

相关参数在 org.apache.dubbo.common.constants.ClusterRules 策略名称作用使用场景 failover 失败启动切换 当出现失败会重试其他服务器&#xff0c;会带来更长延迟&#xff0c;通过 retries2 来设置重试次数&#xff08;不含第一次&#xff09; 通常用于读操作 failfast …