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协程(一)—— 异步程序设计

开发人员始终面临着需要解决的问题——如何防止应用程序被阻塞。 开发桌面应用,移动应用,甚至服务端应用程序时,希望避免让用户等待或阻碍应用程序扩展。

以下会介绍实现异步编程的不同方式 ,包括:

  • 线程
  • 回调
  • FuturesPromises 等等
  • 响应式扩展
  • 协程

1 线程

到目前为止,线程可能是最常见的避免应用程序阻塞的方法:

fun postItem(item: Item) {
    val token = preparePost()
    val post = submitPost(token, item)
    processPost(post)
}

fun preparePost(): Token {
    // 发起请求并因此阻塞了主线程
    return token
}

假设在上面的代码中,preparePost是一个长时间运行的线程,因此会阻塞用户界面。我们可以做的是在一个单独的线程中启动它。这样就可以允许我们避免阻塞UI。这是一种非常常见的技术,但有一系列缺点:

  • 线程切换十分浪费资源
  • 可被启动的线程数受底层操作系统的限制,无能无限启动。在服务器端应用程序中,这可能会导致严重的瓶颈
  • 在一些平台中,比如JavaScript并不支持线程
  • 线程不容易使用。线程的Debug,避免竞争条件是在多线程编程中遇到的常见问题

2 回调

使用回调,将一个函数作为参数传递给另一个函数,并在处理完成后调用此函数:

fun postItem(item: Item) {
    preparePostAsync { token -> 
        submitPostAsync(token, item) { post -> 
            processPost(post)
        }
    }
}

fun preparePostAsync(callback: (Token) -> Unit) {
    // 发起请求并立即返回
    // 设置稍后调用的回调
}

原则上这感觉就像一个更优雅的解决方案,但又有几个问题:

  • 回调嵌套的难度。通常被用作回调的函数,经常最终需要会调自己,这导致出现一系列难以理解的回调嵌套。该模式通常被称为标题圣诞树(大括号代表树的分支)。
  • 错误处理很复杂。嵌套模型使错误处理变得更加复杂。

回调在诸如JavaScript之类的事件循环体系结构中非常常见,但是通常会使用其他方法,例如promises或响应式扩展。

3 FuturesPromises等等

futurespromises的原理是当发起调用的时候,将会在某些时候返回一个Promise类型的可被操作的对象:

fun postItem(item: Item) {
    preparePostAsync() 
        .thenCompose { token -> 
            submitPostAsync(token, item)
        }
        .thenAccept { post -> 
            processPost(post)
        }    
}

fun preparePostAsync(): Promise<Token> {
    // 发起请求并当稍后的请求完成时返回一个 promise
    return promise 
}

这种方法需要对编程方式进行一系列更改,尤其是

  • 不同的编程模型。与回调类似,编程模型从自上而下的命令式方法转变为具有链式调用的组合模型。传统的编程结构例如循环,异常处理,等等。通常在此模型中不再有效
  • 不同的API。通常这需要学习完整的新API诸如 thenComposethenAccept,这也可能因平台而异
  • 具体的返回值类型。返回类型不是需要的实际数据,而是返回一个新类型Promise
  • 异常处理会很复杂。误处理变得更加复杂

4 响应式扩展

Rx的理念是“可观察流”,将数据视为流(无限量的数据),并且可以观察到这些流。 实际上,Rx很简单, Observer Pattern (观察者模式)带有一系列扩展,允许我们对数据进行操作。著名的表述是:“一切都是流,并且它是可被观察的”

observer [?b?z??rv?r] 观察者,目击者;观察家,评论员;(会议等的)观察员 pattern [?p?t?rn] 模式;图案;样品

在方法上它与Futures非常相似,但是开发者可以将Future视为一个离散元素,而Rx返回一个流。Rx的一个好处是,它被移植到这么多平台,通常我们可以找到一致的API体验,无论我们使用 C#JavaJavaScript,还是Rx可用的任何其他语言。

此外,Rx确实引入了一种更好的错误处理方法。

5 协程

Kotlin编写异步代码的方式是使用协程,这是一种计算可被挂起的理念:即一种函数可以在某个时刻暂停执行并稍后恢复。

对于开发人员来说,协程的一个好处是:编写非阻塞代码与编写阻塞代码基本相同,编程模型本身并没有真正改变。

以下面的代码为例:

fun postItem(item: Item) {
    launch {
        val token = preparePost()
        val post = submitPost(token, item)
        processPost(post)
    }
}

suspend fun preparePost(): Token {
    // 发起请求并挂起该协程
    return suspendCoroutine { /* ... */ } 
}

launch[l??nt?] 发动,发起; suspend [s??spend] 暂停,中止;使暂停使用(或生效)

此代码将启动长时间运行的操作,而不会阻塞主线程。preparePost就是所谓的 可挂起的函数它含有suspend 前缀,该函数将被执行、暂停执行以及在某个时间点恢复。

  • 与普通函数相比,唯一的不同是它被添加了 suspend 修饰符
  • 编写这段代码代码就好像在编写同步代码,自上而下,不需要任何特殊语法,除了使用一个名为 launch 的函数,它实质上启动了该协程
  • 编程模型和API保持不变。可以继续使用循环,异常处理等,而且不需要学习一整套新的API
  • 与平台无关。无论我们是面向JVMJavaScript还是其他任何平台,我们编写的代码都是相同的,编译器负责将其适应每个平台

协程并不是一个新的概念,它已经存在了几十年,在Go等其他一些编程语言中很受欢迎。但重要的是要注意是它们在Kotlin中实现的方式,大部分功能都委托给了库。事实上,除了suspend关键字,没有任何其他关键字被添加到Kotlin中,这也是与其他语言的不同之处,例如C#async以及 await 作为语法的一部分,而在Kotlin中,它们都只是库函数。

参考

https://www.kotlincn.net/docs/tutorials/coroutines/async-programming.html

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:02:38  更:2021-10-24 15:03:41 
 
开发: 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年11日历 -2024/11/24 1:23:44-

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