Android 协程的基本使用和最简要原理概述

1、协程是什么

轻量级的线程管理框架

2、协程的特性

  1. 挂起与恢复**suspend**:可在耗时操作时挂起,释放线程资源,完成后自动恢复;
  2. 非阻塞式并发:通过协作式调度实现任务的切换;
  3. 结构化并发:通过作用域自动管理协程生命周期;

其中suspend的实操和原理有单独文章:https://blog.csdn.net/qq_39731011/article/details/123507414

3、协程的使用

1.协程的创建:

launch//协程启动

async//协程启动 - 可能有结果返回

Kotlin 复制代码
    CoroutineScope(Dispatchers.Default).launch {
        //执行内容           
    }

    CoroutineScope(Dispatchers.Default).async {
        //执行可能返回结果的内容 
    }.await() 
    //await(): 拿到具体返回结果

2.让协程运行在指定线程:

注意线程创建时传入的参数:Dispatchers(协程调度器)

Dispatchers.Main

这表示协程运行在主线程

Dispatchers.IO

这表示协程运行在子线程

Dispatchers.Default

这表示协程运行在基于ForkJoinPool 的特殊线程池

它采用了工作窃取算法。可以高效处理大量的小任务

关于工作窃取算法,我这边写了单独的文章https://zhaoxinghai.blog.csdn.net/article/details/152085302

3.协程的关闭:

使用协程创建返回的Job对象,并调用其cancel方法

Kotlin 复制代码
    val job: Job = GlobalScope.launch {
        //执行任务
    }
    job.cancel()//协程关闭/取消

3、协程的生命周期:

正常执行:

创建 -> 执行中 ->完成 ->关闭(进入清理状态)

如果使用了挂起函数suspend:

创建 -> 执行中 ->释放线程等待恢复 ->执行中 ->完成 ->关闭

4、协程的原理:

当遇到一个挂起函数时,就会将协程的代码置换为一个状态机

假设你的协程代码是这样: 最终的打印顺序为注释中的"1""2""3""4"

Kotlin 复制代码
    launch {
        println("准备执行挂起函数")  //1
        doSomething()
        println("他挂起了,所以先执行了我")  //3
    }

    suspend fun xxx() {
        println("进入挂起函数了")  //2
        delay(1000) //假定执行了耗时操作
        println("挂起函数执行完毕了")  //4
    }

置换为状态机后的简化代码如下:

Kotlin 复制代码
    //  当前状态
    var state = 0
    //  核心方法
    override fun resumeWith(result: Result<Unit>) {
        when (state) {
            0 -> {
                xxx(1000, this)//xxx指代挂起函数修饰的方法
                state = 1
                // 代挂起函完成,会再次调用resumeWith方法
                resumeWith()
            }
            1 -> {
                //这时候状态机的状态已经回复,会继续执行挂起函数之后的正常任务内容
            }
        }
    }

5、协程的扩展应用:

Android Flow的基本使用和常用操作符http://zhaoxinghai.blog.csdn.net/article/details/152259008

文章到这里就结束了


复制代码
如果您感觉文章有用的话,麻烦点个赞吧!
如果您发现文章有任何错误或建议,请评论区留言或者私信!
深海谢过各位的支持,一起加油!
相关推荐
草莓熊Lotso44 分钟前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
恋猫de小郭1 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
工程师老罗7 小时前
如何在Android工程中配置NDK版本
android
Libraeking11 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位11 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen12313 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs13 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob13 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔14 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99614 小时前
flutter和Android动画的对比
android·flutter·动画