IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 笔记 | 初探Kotlin协程 -> 正文阅读

[移动开发]笔记 | 初探Kotlin协程

如何理解协程

协程是一种不同于进程线程的存在,其本质是一种函数,同一线程中的多个协程是串行执行的,但为了理解仍然需要三者一起对比。

进程、线程、协程三者的上下文切换对比:

进程线程协程
切换者操作系统操作系统用户(编程者/应用程序)
切换时机根据操作系统自己的切换策略,用户不感知根据操作系统自己的切换策略,用户不感知用户自己(的程序)决定
切换内容页全局目录&内核栈&硬件上下文内核栈&硬件上下文硬件上下文
切换内容的保存保存于内核栈中保存于内核栈中保存于用户自己的变量(用户栈或者堆)
切换过程用户态 - 内核态 - 用户态用户态 - 内核态 - 用户态用户态(没有陷入内核态)
切换效率

从以上协程的特性中,可以知道协程的应用场景是I/O密集型任务,而非计算密集型任务

我认为关于协程的全部,最佳参考为Google官方编写的文章:
谷歌开发者:在 Android 开发中使用协程 | 背景介绍

在安卓开发中使用协程

Kotlin 1.3版本中开始引入了一种全新处理并发的方式:协程,可以在 Android 平台上使用它来简化异步执行的代码,主要用来解决两个问题:

  1. 处理耗时任务 (Long running tasks),这种任务常常会阻塞住主线程;
  2. 保证主线程安全 (Main-safety) ,即确保安全地从主线程调用任何 suspend 函数。

在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程上运行也是如此。suspend并不代表后台执行,在哪里执行由调度器决定。协程可以自行暂停,而调度器负责将其恢复。Kotlin提供了以下三种调度器并罗列了其使用场景:

调度器名称运行线程使用场景适用案例1适用案例2适用案例3
Dispatchers.MainAndroid上的主线程用来处理UI交互和一些轻量级任务调用suspend函数调用UI函数更新LiveData
Dispatchers.IO非主线程专为磁盘和网络IO进行了优化数据库文件读写网络处理
Dispatchers.Default非主线程专为CPU密集型任务进行了优化数组排序JSON数据解析处理差异判断

下面是一个使用调度器的例子。在 get 方法的主体内,调用 withContext(Dispatchers.IO) 来创建一个在 IO 线程池中运行的块。放在该块内的任何代码都始终通过 IO 调度器执行。由于 withContext本身就是一个suspend函数,它会使用协程来保证主线程安全。

// Dispatchers.Main
suspend fun fetchDocs() {    
    // Dispatchers.Main    
    val result = get("developer.android.google.cn")    
    // Dispatchers.Main    
    show(result)
}
// Dispatchers.Main
suspend fun get(url: String) = withContext(Dispatchers.IO) {        
     // Dispatchers.IO    
}    
// Dispatchers.Main

为了更好地管理和使用协程,一般要指定协程上下文(CoroutineContext)和协程作用域(CoroutineScope)。
CoroutineScope 会跟踪它使用 launchasync 创建的所有协程。您可以随时调用 scope.cancel() 以取消正在进行的工作(即正在运行的协程)。在 Android 中,某些 KTX 库为某些生命周期类提供自己的 CoroutineScope。例如,ViewModelviewModelScopeLifecyclelifecycleScope。不过,与调度程序不同,CoroutineScope 不运行协程。

class ExampleClass {

    //异常处理
    private val handler = CoroutineExceptionHandler { _, exception ->
        println("------------BaseViewModel异常捕获--------------")
        exception.printStackTrace()
    }
    protected val parentJob = SupervisorJob() + handler
    
    //协程上下文
    protected open val coroutineContext: CoroutineContext
        get() = parentJob + Dispatchers.IO
    //协程作用域
    protected val scope = CoroutineScope(coroutineContext)
    
    fun exampleMethod() {
        // Starts a new coroutine within the scope
        scope.launch {
            // New coroutine that can call suspend functions
            fetchDocs()
        }
    }

    fun cleanUp() {
        // Cancel the scope to cancel ongoing coroutines work
        scope.cancel()
    }
}

博客首发:https://ranlychan.top/archives/491.html

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:46:08  更:2022-10-17 12:46:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 20:53:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码