CoroutineContext:定义了协程的环境,包括线程、异常处理器等。 launch:启动一个新的协程。 async:异步执行一个任务并返回一个Deferred对象。 await:等待Deferred对象的结果。 示例 importkotlinx.coroutines.*funmain()= runBlocking {valdeferred = async { delay(1000L)// 模拟耗时操作"Hello, World!"} println(d...
从概念上讲,CoroutineContext 只是个上下文而已,开发中最常见的用处就是切换线程池,但其背后的代码设计其实比较复杂,Kotlin 协程中比较重要的概念,都或多或少跟 CoroutineContext 有关系。 CoroutineContext 简介 前面我们在很多地方已经见过 CoroutineContext:
CommonPool 有点类似于 RxJava 的 Schedulers.computation(),主要是用于CPU密集型的计算任务。 CommonPool 使用 pool 来执行 block。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 override fun dispatch(context: CoroutineContext, block: Runnable) = try { (pool ?: getOrCreatePoolSync()).execute(ti...
每个协程生成器launch、async等都是CoroutineScope的扩展,并继承了它的coroutineContext,自动传播其所有元素和取消。 启动协程需要作用域,但是作用域又是在协程创建过程中产生的。 public interface CoroutineScope { /** * 此域的上下文。Context被作用域封装,用于在作用域上扩展的协程构建器的实现。 */ public val ...
所以当你碰到以上这些耗时任务(long-running tasks)的时候,能够第一时间想到用Kotlin Coroutines来解决,那么说明你已经摸到一点门道了。 这里说句题外话:在Android中处理异步、耗时任务的技术,以前常用的应该是RxJava,或者Java提供的线程池Executors,以及Android的 AsyncTask。
在协程启动部分提到,启动协程需要三个部分,其中一个部分就是上下文,其接口类型是CoroutineContext,通常所见的上下文类型是CombinedContext或者EmptyCoroutineContext,一个表示上下文组合,另一个表示空。 协程上下文是Kotlin协程的基本结构单元,主要承载着资源获取,配置管理等工作,是执行环境的通用数据资源的统一管理者。除此之外...
Job是launch构建协程返回的一个协程任务,完成时是没有返回值的。可以把Job看成协程对象本身,封装了协程中需要执行的代码逻辑,协程的操作方法都在Job身上。Job具有生命周期并且可以取消,它也是上下文元素,继承自CoroutineContext。 在日常Android开发过程中,协程配合 Lifecycle 可以做到自动取消。
CoroutineContext 是一个接口,如 Job、Deferred、Dispatcher、CoroutineName、CoroutineExceptionHandler、挂起函数都与 CoroutineContext 密切联系。 CoroutineScope 协程作用域,用于批量控制协程,本质是对 CoroutineContext 的一层简单封装。 Dispatchers 协程调度器
CommonPool 有点类似于 RxJava 的 Schedulers.computation(),主要是用于CPU密集型的计算任务。 CommonPool 使用 pool 来执行 block。 override fun dispatch(context: CoroutineContext, block: Runnable) =try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) }catch (e: RejectedExecut...
🏝️// 方法一,使用 runBlocking 顶层函数runBlocking{getImage(imageId)}// 方法二,使用 GlobalScope 单例对象// 👇 可以直接调用 launch 开启协程GlobalScope.launch{getImage(imageId)}// 方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象// 👇 需要一个类型为 CoroutineContext 的参数valcorou...