首页 > 其他分享 >【Android图片框架】都用Kotlin协程了,快来试试Coil~

【Android图片框架】都用Kotlin协程了,快来试试Coil~

时间:2024-05-30 14:32:49浏览次数:10  
标签:协程 Glide Kotlin image coil Coil 图片 加载

回顾一下Glide

        Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。

Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

一、啥是Coil

Coil 是一个 Android 图片加载库,通过 Kotlin 协程的方式加载图片。特点如下:

  • 更快: Coil 在性能上有很多优化,包括内存缓存和磁盘缓存,把缩略图存保存在内存中,循环利用 bitmap,自动暂停和取消图片网络请求等。

  • 更轻量级: Coil 只有2000个方法(前提是你的 APP 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量很多。

  • 更容易使用: Coil 的 API 充分利用了 Kotlin 语言的新特性,简化和减少了很多样板代码。

  • 更流行: Coil 首选 Kotlin 语言开发并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在内最流行的开源库。

Coil 名字的由来:取 Coroutine Image Loader 首字母得来。

二、效率对比

目前网上的性能对比的文章都是一两年的版本,想清楚两者现在的情况,同时自己也从各方面对比一下,先进行效率对比,然后进行综合对比。

2.1 进行测试

测试版本

//Coil
implementation("com.github.bumptech.glide:glide:4.16.0")

//Glide
implementation("io.coil-kt:coil:2.6.0")

测试的布局及资源

一进入页面就进行加载这十张图(问的chatgpt 给我十张50kb左右的图片)

测试条件

时机:从开始调用到生成Drawable,分别测试

情况:测试有缓存情况(DiskCache)和没有缓存情况下的加载耗时


           var url = item
            var startTime: Long = 0
            var endTime: Long = 0
            startTime = SystemClock.uptimeMillis()
            if (isGlide) {
                Glide.with(context).load(item)
//                    .skipMemoryCache(true)
//                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .into(object : CustomTarget<Drawable>() {
                        override fun onResourceReady(
                            resource: Drawable,
                            transition: Transition<in Drawable>?
                        ) {
                            endTime = SystemClock.uptimeMillis() // 获取结束时间
                            LogUtils.d(
                                "glide TestTime",
                                "onSuccess position: " + holder.bindingAdapterPosition + "  item:" + item + "   Runtime: " + (endTime - startTime)
                            )
                            holder.binding.image.setImageDrawable(resource)
                        }

                        override fun onl oadCleared(placeholder: Drawable?) {

                        }

                    })

2.2 生成数据

当首次加载时(下载速度10MB/s)

当从缓存中加载时

2.3相较于过去版本

从选取19年的文章

首次加载

缓存加载

注:统计学是科学严谨的 当前样本过少仅表现当前数据下的大致趋势

数据仅供参考 个人认为还是有较大进步的

三、具体使用

快速上手

可以使用 ImageView 的扩展函数 load 加载一张图片:

// URL

imageView.load("https://example.com/image.jpg")

// Resource

imageView.load(R.drawable.image)

// File

imageView.load(File("/path/to/image.jpg"))

// And more...

可以使用 lambda 语法轻松配置请求选项:

imageView.load("https://example.com/image.jpg") {

crossfade(true)

placeholder(R.drawable.image)

transformations(CircleCropTransformation())

}

Jetpack Compose

引入 Jetpack Compose 扩展库:

implementation("io.coil-kt:coil-compose:2.6.0")

使用 AsyncImage 加载图片:

AsyncImage(

model = "https://example.com/image.jpg",

contentDescription = null,

)

图片加载器 ImageLoader

imageView.load 使用单例 ImageLoader 来把 ImageRequest 加入队列. ImageLoader 单例可以通过扩展方法来获取:

val imageLoader = context.imageLoader

此外,你也可以通过创建 ImageLoader 实例从而实现依赖注入:

val imageLoader = ImageLoader(context)

如果你不需要 ImageLoader 作为单例,请把Gradle依赖替换成 io.coil-kt:coil-base.

图片请求 ImageRequest

//如果想定制 ImageRequest 的加载目标,可以依照如下方式把 ImageRequest 加入队列:

val request = ImageRequest.Builder(context)

.data("https://example.com/image.jpg")

.target { drawable ->// Handle the result.

}

.build()

val disposable = imageLoader.enqueue(request)

//如果想命令式地执行图片加载,也可以直接调用 execute(ImageRequest):

val request = ImageRequest.Builder(context)

.data("https://example.com/image.jpg")

.build()

val drawable = imageLoader.execute(request).drawable

请至 Coil 的完整文档获得更多信息。

动态图片采样

      这里简单的说明一下,假设本地有一个 500x500 的图片,当从磁盘读取 500x500 的图片时,将使用 100x100 的映像作为占位符,等待加载完成之后才会完全显示,用官方的一张动图显示过程如下。

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="tcali5yL-1717050245933" src="https://live.csdn.net/v/embed/394386"></iframe>

coil动态图片采样

四、参考文档

  • https://coil-kt.github.io/coil/getting_started/

  • https://zhuanlan.zhihu.com/p/287752448

  • http://t.csdnimg.cn/YQxHd

标签:协程,Glide,Kotlin,image,coil,Coil,图片,加载
From: https://blog.csdn.net/qq_36544007/article/details/139318375

相关文章

  • 线程简述:协程、抢占式、sleep、wait、interrupt,优雅中断线程,线程通信等
    思维导图在此:java线程简述-CSDN博客1、线程与协程协程-->线程-->进程,协程最小协程:用户态,go语言线程:用户态、内核态都有。cpu调度的最小单位。是工人,从进程获取资源,多个线程共享进程的资源。进程:内核态。操作系统调度资源的最小单位。是资源管家。2、调度机制协同式。......
  • Kotlin 标准函数 with、run、apply 的定义和使用
    Kotlin标准函数 with、run、apply 的定义和使用1. with 函数定义:with 函数允许你在一个对象的上下文中执行一个lambda表达式,而不需要在lambda表达式中重复引用该对象。@kotlin.internal.InlineOnlypublicinlinefun<T,R>with(receiver:T,block:T.()->R......
  • kotlin基础之协程
    Kotlin协程(Coroutines)是Kotlin提供的一种轻量级的线程模型,它允许我们以非阻塞的方式编写异步代码,而无需使用回调、线程或复杂的并发API。协程是一种用户态的轻量级线程,它可以在需要时挂起和恢复,从而有效地管理资源,提高应用程序的响应性和性能。Kotlin协程的概念轻量级线程:协......
  • 协程 进程 线程的区别
    协程(Coroutine)、进程(Process)和线程(Thread)是三种并发编程的技术,它们在并发控制、资源使用和上下文切换方面有不同的特点和用途。以下是它们的主要区别:进程定义:进程是操作系统分配资源和调度的基本单位。每个进程拥有独立的地址空间、全局变量、堆和栈。资源开销:进程之间的切换......
  • kotlin基础之高阶函数
    Kotlin中的高阶函数、内联函数以及noinline和crossinline关键字是函数式编程中的重要概念。下面我将逐一解释这些概念的定义、实现原理、使用场景以及noinline和crossinline关键字的具体用法。高阶函数定义:高阶函数是接受一个或多个函数作为参数,或者返回一个函数的函数。实......
  • Unity热更学习--Lua脚本使用C#中的事件、委托和协程
    [14]lua调用使用C#中的事件和委托C#脚本:继续在Student类中声明//声明委托和事件publicUnityActiondele;publiceventUnityActioneventAction;publicvoidDoDele(){if(dele!=null)dele();}publicvoidDoEvent(){if(eventAction!=null)......
  • 基于Python的性能优化--多线程、协程、多进程
    合集-Python(1) 1.基于Python的性能优化05-24收起 一、多线程在CPU不密集、IO密集的任务下,多线程可以一定程度的提升运行效率。importthreadingimporttimeimportrequestsdeffetch_url(url:str)->None:'''根据地址发起请求,获取响应-url:......
  • 协程asyncio 模块
    协程不是系统级线程,很多时候协程被称为“轻量级线程”、“微线程”、“纤程(fiber)”等。简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换。协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的......
  • C++高性能服务器框架—协程模块
    协程模块概述一、概念可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的;对比首先介绍一下为什么要使用协程。从了解进程,线程,协程之间的区别开始。从定义来看进程是资源分配和拥有的基本单位。进程通过内存映射拥有独立的代......
  • 通过构建安卓应用学习-Kotlin-全-
    通过构建安卓应用学习Kotlin(全)原文:zh.annas-archive.org/md5/201D65C8BC4C6A97336C0B7173DD6D6D译者:飞龙协议:CCBY-NC-SA4.0前言“教育的目的是培养具有技能和专业知识的优秀人才。真正的教育提升了人的尊严,增加了他或她的自尊。如果每个人都能意识到真正的教育,并在人类......