![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Kotlin Coroutine
文章平均质量分 86
Kotlin协程相关文章
fundroid
Android GDE(谷歌开发者专家)| 互联网大厂移动端架构师
展开
-
Jetpack MVVM 七宗罪之四: 使用 LiveData/StateFlow 发送 Events
久违的 “ Jetpack MVVM 七宗罪 ” 系列,今日再开。本系列主要盘点 MVVM 架构中各种常见错误写法,并针对性的给出最佳实践,帮助大家掌握 Jetpack 组件最正确的使用姿势。Jetpack MVVM 七宗罪之一: 拿 Fragment 当 LifecycleOwnerJetpack MVVM 七宗罪之二: 在 launchWhenX 中启动协程Jetpack MVVM 七宗罪之三: 在 onViewCreated 中加载数据前言在 MVVM 架构中,我们通常使用 Liv.原创 2021-12-27 00:32:39 · 2237 阅读 · 0 评论 -
【Kotlin协程】避免在suspend函数中使用@Synchronized修饰符
使用Kotlin时,我们通常使用@Synchronized实现线程间同步,因此很多刚接触协程的同学,视图在挂起函数上添加@Synchronized以实现”协程间同步”,这是否有效呢?1. 协程+Synchronized ?通常,协程可以帮助我们执行并行任务:suspend fun doSomething(i: Int) { println("#$i enter critical section.") // do something critical delay(1000).原创 2020-10-05 20:13:52 · 3245 阅读 · 0 评论 -
【Android】在Activity中使用LifecycleScope替代GlobalScope
GlobalScope的问题我们在Activity或Fragment中使用协程时,要尽量避免使用GlobalScope。class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)原创 2020-10-01 21:25:28 · 12904 阅读 · 3 评论 -
告别RxJava:Coroutine Channel替代Rx Observable/Subject
最近有一些文章建议大家放弃RxJava。在AAC推荐的MVVM最佳实践中重度依赖了RxJava,是不是也可以考虑去掉其中的RxJava呢?RxJava的问题功能过剩MVVM中使用RxJava主要用来进行异步请求以及订阅,但RxJava的能力远不止于此,他更是一个操作符众多的流式响应式框架,功能众多确不被熟知和使用,除了徒增包体积以为,还有误用操作符造成bug的风险Kotlin不友好RxJava虽然可以在Kotlin中使用,但毕竟本身是用Java写的,对函数式Lambda的支持不够Ko.原创 2020-08-08 23:27:12 · 1805 阅读 · 0 评论 -
【Kotlin协程】当DialogFragment遇上Coroutine
Android对话框有多种实现方法,目前比较推荐的是DialogFragment,相对于直接使用AlertDialog来说,可以避免屏幕旋转会的消失。但是其建立在回调基础上的API使用起来并不友好。好在有RxJava、Coroutine等优秀的工具,我们可以对其进行一番改造。基于Coroutine+RxJava的改造build.gradledependencies { // 省略 implementation "org.jetbrains.kotlinx:kotlinx-coro.原创 2020-08-03 00:26:40 · 1133 阅读 · 0 评论 -
【Kotlin协程】基于RxJava项目的Coroutine改造
最近,Android宣布彻底废弃AsyncTask,推荐Coroutine作为首选的异步编程方案。如果说AsyncTask被Coroutine替代毫无悬念,那RxJava与Coroutine如何取舍呢?J神很早就就给出自己的看法了。当时Flow还未出现,现在J神恐怕连Observable、Subject也早就不用了。 RxJava在Android中被废弃的日子恐怕也不远了。那么,一个既有的RxJava的MVVM项目如何简单地改造为Coroutine呢?RxJava例子以一个RxJava项目为例,原创 2020-07-18 22:51:57 · 2021 阅读 · 2 评论 -
解密Kotlin协程的suspend修饰符
Kotlin 协程中引入了 suspend 修饰符和挂起函数的概念,Kotlin 编译器将会为每个挂起函数创建一个状态机,这个状态机将为我们管理协程的操作。协程协程简化了 Android 平台的异步操作。正如官网《利用 Kotlin 协程提升应用性能》所介绍的,我们可以使用协程管理那些可能阻塞主线程的异步任务,更奇妙的是可以使用命令式代码替换那些基于回调的 API:// 简化的只考虑了基础功能的代码fun loginUser(userId: String, password: String, u.转载 2020-06-01 20:50:25 · 8622 阅读 · 4 评论 -
Kotlin Coroutine 最佳实践
协程API使用起来有一定门槛,本文整理了一些协程使用中的最佳实践,希望能为新接触的同学提供一点参考:对异常进行包装async{}发生异常时,堆栈日志只有Coroutine中的信息,难以调查。此时可以通过coroutineScope捕获异常,包装后抛出,此时错误堆栈中就包含代码信息了。try { coroutineScope { val mayFailAsync1 = async { mayFail1() } val m.原创 2020-05-31 23:44:52 · 861 阅读 · 0 评论 -
线程调度哪家强?RxJava与Flow的多线程编程
Flow是Coroutine版的RxJava(准确的是RxJava的Observable,因为Flow是冷流),Flow与RxJava都可以方便的进行线程切换,在各种多线程场景中有很多相似点和不同点,本文将针对这些异同进行一个简单介绍RxJava我们先来回顾一下RxJava中的线程切换如上,RxJava使用subscriberOn与observeOn进行线程切换subscribeOnsubscribeOn用来决定订阅时的线程,使用中有两点注意:当调用链上只有一个subscribeOn时.原创 2020-05-20 21:49:20 · 1127 阅读 · 0 评论 -
【Android】ViewModel KTX对Coroutine的支持
androidx.lifecycle:lifecycle-viewmodel-ktx是ViewModel的KTX扩展库,可以让我们在ViewModel中方便的使用Coroutine。对于ViewModel-KTX的使用,我们需要关注以下三个知识点:ViewModelScope的使用suspend函数的调用Flow的订阅接下来通过一个MVVM架构的示例,围绕上面这三点进行一个简单介绍。...原创 2020-03-19 00:59:59 · 2740 阅读 · 0 评论 -
Kotlin协程介绍(五)挂起函数
Kotlin协程介绍(二)实现原理中介绍过,挂起函数经过编译后以CPS的形式运行。反之,也可以将CPS转成挂起函数,使之可在协程中使用。这具体是通过suspendCoroutine{}或suspendCancellableCoroutine{}实现的public suspend inline fun <T> suspendCoroutine(crossinline bl...原创 2020-01-28 00:02:35 · 2083 阅读 · 0 评论 -
Kotlin协程介绍(四)创建协程 async/await
Kotlin协程介绍(四)创建协程 launch中介绍了可以使用launch创建并启动一个协程,除此之外还可以通过async创建并启动一个协程:public fun <T> CoroutineScope.async( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart =...原创 2020-01-27 20:24:55 · 10002 阅读 · 0 评论 -
Kotlin协程介绍(三)创建协程 launch
通过Kotlin协程介绍(二)我们知道协程会将挂起函数(suspend函数)在编译期转换为CPS,suspend函数只能在协程或者另一个suspend中运行,那么如何创建一个协程呢?CoroutineScope.launch可以通过GlobalScope.launch创建并立即启动一个协程GlobalScope.launch { val start = System.curr...原创 2020-01-27 20:05:16 · 1299 阅读 · 0 评论 -
Kotlin协程介绍(二)实现原理
通过Kotlin协程介绍(一)我们了解到协程可以让顺序的代码实现CPS的效果,实际上协程的本质就是在编译期将顺序代码变为CPS。协程用suspend关键字声明一个挂起函数suspend fun delay(time: Int)挂起函数经过编译后,在jvm里会变成一个CPS://Continuation用来实现CPS的回调interface Continuation<T>...原创 2020-01-27 17:16:12 · 689 阅读 · 0 评论 -
Kotlin协程的launch与async
Kotlin中启动协程的方式常用的有两种:launch/join以及async/await。这两种方式有什么区别呢?launchlaunch用来启动一个子协程并立即返回,协程像线程一样异步执行。协程中的未捕获异常会导致进程的crash。launch返回一个Job对象,通过Job.join方法可以同步等待协程的完成,就像thread的join一样。fun main(args: Arra...原创 2020-01-28 23:05:42 · 2749 阅读 · 0 评论 -
基于Kotlin协程实现MVP/MVVM
Kotlin已经正式成为Android的官方开发语言,越来越多的Andorid框架/三方库开始用Kotlin实现。我也尝试通过Kotlin的协程来实现Android常见的MVP/MVVP架构,希望能将Kotlin更好地融入日常开发中。协程的同步和异步使用协程,可以方便地实现各种同步或者异步逻辑。通过suspend函数,我们可以在不阻塞线程的情况下,实现线程间的同步suspend ...原创 2020-01-28 21:22:10 · 1560 阅读 · 0 评论 -
Kotlin协程介绍(一)基本概念
协程(英文Coroutine)并非一个新概念,早在上世纪60年代Cobol编译器中被首次提出,其目的是将程序分离成多个任务,可以相互配合并且独立运行,co-routine的名字也正体现了互相配合之意。协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。协程的关键是分清挂起和...原创 2020-01-27 14:07:53 · 881 阅读 · 0 评论 -
用Coroutine替代AsyncTask
使用Coroutine可以避免异步任务中的回调,首先想到的就是可以把AsyncTask给替换掉。废话少说,先看东西:AsyncTask用AsyncTask实现的一段逻辑:点击Button后,TextView依次显示Start --> 1 ... 10 --> endclass MainActivity : AppCompatActivity() { overri...原创 2020-02-24 18:54:46 · 2873 阅读 · 0 评论 -
Kotlin协程进行HTTP请求
Android中使用协程进行Http异步请求的简单实例。Gradle配置dependencies { implementation 'com.squareup.okhttp3:okhttp:4.1.0' implementation 'com.eclipsesource.minimal-json:minimal-json:0.9.5' def coroutines_...原创 2020-02-22 19:09:11 · 3590 阅读 · 0 评论 -
RxJava与Coroutine对比
RxJava作为流式异步框架早已被广泛熟知和使用,如今Kotlin又为我们提供了一个新的选择Coroutine、在一些场景下可以替代RxJava的使用。本文通过比较两者在使用上的不同,希望让RxJava的使用者们能了解到Coroutine的优点,可以作为一个新的选项在项目中应用。本文适合以下读者:有Kotlin的使用经验有RxJava(RxKotlin)的使用经验有兴趣尝试Coroutin...原创 2020-02-22 18:32:57 · 1916 阅读 · 0 评论 -
Retrofit2+Kolin协程
Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用。本文简单介绍一下Retrofit中协程的使用data class首先定义一个data class 模拟Api请求的responsedata class Repos( val id: Int, val name: String)Retrofit创建Retrofit...原创 2020-02-19 12:27:06 · 5053 阅读 · 0 评论