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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotilin 协程 学习笔记 -> 正文阅读

[移动开发]Kotilin 协程 学习笔记

Kotlin 协程

协程基于线程,是轻量级的线程。
协程可以让异步逻辑的代码同步化。

使用kotlin协程需要添加依赖库:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'

第二个依赖是在Android项目中才会用到。

最简单方式创建协程:

GlobalScope.launch {
    println("Hello World!")
    delay(1000)
}
Thread.sleep(1000)

GlobalScope.launch创建的是顶层协程,这种协程会随着应用程序的结束而结束。
delay()函数是一个非阻塞式的挂起函数,它只会挂起当前协程,并不影响其它协程的运行。而Thread.sleep()方法会阻塞当前的线程。delay()函数只能在协程的作用域或其它挂起函数中调用。

runBlocking 函数会创建一个协程作用域,但它可以保证在协程作用域内的所有代码和协程没有执行完之前一直阻塞当前线程。
launch函数可以创建一个新的子协程。

    runBlocking {
        launch {
            delay(1000)
            println("launch1")
        }
        launch {
            delay(1000)
            println("launch1")
        }
    }

使用suspend关键字可将函数声明为挂起函数:

suspend fun printDot() = coroutineScope {
    launch {
        println(".")
        delay(1000)
    }
}

coroutineScope函数是一个挂起函数,可以在其它挂起函数中调用,它会继承外部的协程的作用域并创建一个子协程,这样就可以给任意挂起函数提供协程作用域了。

async函数与await函数

async函数创建一个新的子协程并返回一个Deferred对象,如果我们想要获取async函数代码块的执行结果,只需调用Deferred对象的await()方法即可:

   runBlocking {
        val result = async {
            1 + 1
        }.await()
        println(result)
    }

withContext()

withContext()也是一个作用域构建起,它是一个挂起函数。代码块的最后一行会作为该函数的返回值。
使用withContext()需要指定线程参数:Dispatchers.IO、Dispatchers.Ddefault、Dispatchers.Main。

    runBlocking {
        val result = withContext(Dispatchers.Default) {
            1 + 1
        }
        println(result)
    }

使用协程简化回调的写法

suspend fun request(address: String): String {
    return suspendCoroutine { continuation ->
        HttpUtil.sendHttpRequest(address, object : HttpCallbackListener {
            override fun onFinish(response: String) {
                continuation.resume(response)
            }

            override fun onError(e: Exception) {
                continuation.resumeWithException(e)
            }

        })
    }
}

suspend fun getBaiduResponse() {
    try {
        val response = request("https://www.baidu.com/")
        // 处理数据
    }catch (e: Exception){
        // 处理异常
    }
}

使用协程简化Retrofit发起网络请求

suspend fun <T> Call<T>.await(): T {
    return suspendCoroutine { continuation ->
        enqueue(object : Callback<T>) {
            override fun onResponse(call: Call<T>,response: Response<T>) {
                val body = response.body()
                if (body != null ) continuation.resume(body)
                else continuation.resumeWithException(
                    kotlin.RuntimeException("response body is null")
                )
            }
            override fun onFailure(call: Call<T>,t: Throwable) {
                continuation.resumeWithException(t)
            }
        }
    }
}

suspend fun getUserData() {
    try {
        val userList = ServiceCreator.create<AppService>().getUserData().await()
        // 处理响应数据
    }catch (e: Exception){
        // 处理异常
    }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:19:40  更:2021-08-04 11:20:28 
 
开发: 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/6 3:10:48-

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