码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Android Gldie复用只取之前decode过的缓存resource,Kotlin


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

     

     

    1. import android.graphics.Bitmap
    2. import android.os.Bundle
    3. import android.util.Log
    4. import android.widget.ImageView
    5. import androidx.appcompat.app.AppCompatActivity
    6. import androidx.lifecycle.lifecycleScope
    7. import com.bumptech.glide.load.DataSource
    8. import com.bumptech.glide.load.engine.GlideException
    9. import com.bumptech.glide.load.resource.bitmap.CenterCrop
    10. import com.bumptech.glide.request.RequestListener
    11. import com.bumptech.glide.request.target.Target
    12. import kotlinx.coroutines.Dispatchers
    13. import kotlinx.coroutines.channels.Channel
    14. import kotlinx.coroutines.flow.receiveAsFlow
    15. import kotlinx.coroutines.launch
    16. class MainActivity : AppCompatActivity() {
    17. private val TAG = "Glide/${this::class.simpleName}"
    18. companion object {
    19. const val FAIL = -1
    20. const val SUCCESS = 1
    21. const val SIZE = 400
    22. }
    23. private val mCrop = CenterCrop()
    24. private val resId = R.mipmap.pic2
    25. private var mImageView: ImageView? = null
    26. private val mChannel = Channel<Int>()
    27. override fun onCreate(savedInstanceState: Bundle?) {
    28. super.onCreate(savedInstanceState)
    29. setContentView(R.layout.activity_main)
    30. val imageView = findViewById(R.id.image)
    31. mImageView = findViewById(R.id.image2)
    32. GlideApp.with(this)
    33. .asBitmap()
    34. .load(resId)
    35. .transform(mCrop)
    36. .override(SIZE, SIZE)
    37. .addListener(object : RequestListener {
    38. override fun onLoadFailed(
    39. e: GlideException?,
    40. model: Any?,
    41. target: Target<Bitmap>,
    42. isFirstResource: Boolean
    43. ): Boolean {
    44. Log.d(TAG, "onLoadFailed")
    45. signal(FAIL)
    46. return false
    47. }
    48. override fun onResourceReady(
    49. resource: Bitmap,
    50. model: Any,
    51. target: Target<Bitmap>?,
    52. dataSource: DataSource,
    53. isFirstResource: Boolean
    54. ): Boolean {
    55. Log.d(TAG, "onResourceReady")
    56. signal(SUCCESS)
    57. return false
    58. }
    59. }).into(imageView)
    60. waitReceive()
    61. }
    62. fun signal(s: Int) {
    63. lifecycleScope.launch(Dispatchers.IO) {
    64. mChannel.send(s)
    65. }
    66. }
    67. private fun waitReceive() {
    68. lifecycleScope.launch(Dispatchers.IO) {
    69. mChannel.receiveAsFlow().collect {
    70. Log.d(TAG, "collect $it")
    71. if (it == SUCCESS) {
    72. fetchCacheBitmap()
    73. }
    74. }
    75. }
    76. }
    77. private fun fetchCacheBitmap() {
    78. val bitmap = runCatching {
    79. GlideApp.with(this@MainActivity)
    80. .asBitmap()
    81. .load(resId)
    82. .transform(mCrop)
    83. .onlyRetrieveFromCache(true) //从内存或者glide decode好的resource里面取,不去原始decode
    84. .override(SIZE, SIZE)
    85. .addListener(object : RequestListener {
    86. override fun onLoadFailed(
    87. e: GlideException?,
    88. model: Any?,
    89. target: Target<Bitmap>,
    90. isFirstResource: Boolean
    91. ): Boolean {
    92. Log.d(TAG, "cache onLoadFailed")
    93. return false
    94. }
    95. override fun onResourceReady(
    96. resource: Bitmap,
    97. model: Any,
    98. target: Target<Bitmap>?,
    99. dataSource: DataSource,
    100. isFirstResource: Boolean
    101. ): Boolean {
    102. Log.d(TAG, "cache onResourceReady")
    103. return false
    104. }
    105. }).submit()
    106. .get() //不要在这里加timeout值
    107. }.onFailure {
    108. Log.d(TAG, "取Glide缓存失败:${it.message}")
    109. }.onSuccess {
    110. Log.d(TAG, "取Glide缓存成功:${it.byteCount}")
    111. }.getOrNull()
    112. Log.d(TAG, "getOrNull=${bitmap?.byteCount}")
    113. if (bitmap != null) {
    114. lifecycleScope.launch(Dispatchers.Main) {
    115. //之前的缓存资源取到了。
    116. //使用之前的缓存,设置到新的ImageView里面。
    117. mImageView?.setImageBitmap(bitmap)
    118. }
    119. }
    120. }
    121. }

     

     

    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

     

  • 相关阅读:
    随机分布式延迟PSO(RODDPSO)+K-Means算法(Python代码实现)
    python实现目标检测voc格式标签数据增强
    洛谷 P5712 Apples C++代码
    使用c#将aj-report桌面化1
    CCF中国开源大会专访 | 刘旭东:着眼“开源联合”,实现“聚力共赢”
    Vue 插槽(slot)使用
    Linux权限
    android5.1 launcher2去掉桌面应用图标
    设计模式之单例模式
    ffmpeg基础五:单独解码裸流aac或MP3或H264
  • 原文地址:https://blog.csdn.net/zhangphil/article/details/134177924
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号