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

这篇具有很好参考价值的文章主要介绍了Android Gldie复用只取之前decode过的缓存resource,Kotlin。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

 

 文章来源地址https://www.toymoban.com/news/detail-743973.html

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.launch


class MainActivity : AppCompatActivity() {
    private val TAG = "Glide/${this::class.simpleName}"

    companion object {
        const val FAIL = -1
        const val SUCCESS = 1
        const val SIZE = 400
    }

    private val mCrop = CenterCrop()
    private val resId = R.mipmap.pic2
    private var mImageView: ImageView? = null

    private 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)
            }
        }
    }
}

 

 

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

可以看到,第一次因为是全新的加载,没有缓存,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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium-webdriver_manager判断是否已经下载过驱动(复用缓存驱动)

    2,ChromeDriverManager 下载的驱动位置 其中admin为机器的用户名

    2024年04月12日
    浏览(83)
  • 关于android11,12权限问题Unable to decode stream: open failed: EACCES (Permission denied)

    第一次发博客 这个问题是我在制作一款app时发现的,我本来想在一个textview中加入一个图片 但是总是报错 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20230129_123518.jpg: open failed: EACCES (Permission denied) 我在浏览了大多数关于这个问题的讨论和

    2024年02月07日
    浏览(66)
  • Android Studio 关于android resource linking failed的报错解决方法

    在android studio学习过程中经常会遇到一个android resource linking failed的错误,在编译的时候不会报错也没有提示,一运行就出现个这样的错误,这种问题可以分以下两种情况 1、假如提醒了具体错误位置,那么这个错误大概率是出现在你的 代码段 里,如下图 这里提示错误出现在

    2024年02月15日
    浏览(38)
  • Android AAPT: error: resource color 异常原因处理

    异常体现: 该异常是删除了项目创建时系统引用的颜色资源,导致的编译失败异常; 异常解决: 根据提示在color.xml里加入报错的颜色资源 上面只是举例,报错的颜色和本文不对应的话,以你报错的日志中的颜色决定加入的颜色名

    2024年02月09日
    浏览(35)
  • 【车载 Android】应用换肤方案(一) - Runtime Resource Overlay

    手机应用的动态换肤功能目前已经使用的比较广泛了,也有许多文章分析了其中的原理,使用方式也大同小异,基本都需要在应用内集成一个三方的框架,或独立开发一个换肤框架。此类换肤方式需要长期维护一套换肤框架,对原始应用存在一定的侵入性,开发的复杂度、工

    2024年02月06日
    浏览(39)
  • Android编译时报错Can not extract resource from com.android.aaptcompiler.ParsedResource

    Can not extract resource from com.android.aaptcompiler.ParsedResource@119ffea4.,Can not extract resource from com.android.aaptcompiler.ParsedResource@4a45239b. 原因是values文件中有错,因为我在标签中加的字符串放了引号 ’ 将引号转译即可 /’ 这种报错也可能是其他资源文件,check一下代码看自己新加了哪些东

    2024年02月11日
    浏览(44)
  • 探索 Docker-Android:一个高效且可复用的安卓开发环境容器

    项目地址:https://gitcode.com/butomo1989/docker-android 本文将向您推荐 Docker-Android 项目,这是一个基于 Docker 的解决方案,旨在提供快速、一致性的 Android 开发和测试环境。通过利用 Docker 容器的优势,它极大地简化了设置和管理多版本 Android 环境的过程。 Docker-Android 是由开发者 But

    2024年04月16日
    浏览(38)
  • Android Studio--Can not extract resource from com.android.aaptcompiler.ParsedResource@5a5999f0

    Android Studio build APK报错: Can not extract resource from com.android.aaptcompiler.ParsedResource@5a5999f0.,Can not extract resource from com.android.aaptcompiler.ParsedResource@5e660663. 查看报错日志:Caused by: com.android.aaptcompiler.ResourceCompilationException: Failed to compile values resource file D:SoftwareAndroidStudioProjects××××

    2024年02月03日
    浏览(34)
  • Android dp to pix resources.getDimension(R.dimen.xxx) ,kotlin

    Android dp to pix resources.getDimension(R.dimen.xxx) ,kotlin    Android官方dip值到pix值转换:dip2pix,dip2px,dp2px实现_zhangphil的博客-CSDN博客 Android官方的dip to pix,dip2pix,dp2px实现网上流传的一个常用的把dip值转换为pix像素值的方法通常是这样的: public static int dip2px(Context context, float dpValu

    2024年02月16日
    浏览(37)
  • Can not extract resource from com.android.aaptcompiler.ParsedResource@41af2751.

    问题描述:在运行安卓项目出现了如以下截图的错误,并且每次运行项目显示错误“Can not extract resource from com.android.aaptcompiler.ParsedResource@41af2751.” 其@后面的编号都不一样 后面的解决方法是其资源文件values中的colors.xml文件中某个颜色设置有误,比如少了#号或者是其他错误都

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包