Kotlin协程入门到实战全部三篇文章:
- Kotlin协程Coroutines入门到实战:(一)理解异步回调的本质
- Kotlin协程Coroutines入门到实战:(二)Coroutines初体验
- Kotlin协程Coroutines入门到实战:(三)Coroutines+Retrofit+ViewModel+LiveData实现MVVM客户端架构
学习了Kotlin协程之后感觉协程是个可以化腐朽为神奇的东西,但是如果习惯了之前的编程方式,刚接触Kotlin协程的话理解起来还是比较吃力的。这里我总结了自己对于Kotlin协程的理解和学习经验,希望对大家的学习有所帮助。
整个系列分为三部分,希望大家可以耐心看完。
1.什么是异步
我记得小学二年级碰到过一个让我受益终身的数学题:烧开水需要15分钟,洗碗需要5分钟,扫地需要5分钟,请问做完这三件事,总共需要几分钟?从此我做什么事,都事先想想先后顺序,看看可不可以一井去做。
长大后才知道这就是异步的用法,它其实已经渗透到你的生活中。
上面这段话节选自:余叶《代码里的世界观——通往架构师之路》,这段话中揭示了异步的本质。异步意昧着同时进行一个以上彼此目的不同的任务。
如果上面三个任务一个一个按部就班地去做的话,你可能总共需要25分钟。但是烧开水的时候并不需要你在一旁一直等待着,如果你利用烧开水的时间去完成洗碗和扫地的任务,你只需要15分钟就可以完成以上三个任务。
接着试着对着Android(或者其他任何UI开发框架)的线程模型类比一下:你是主线程。烧开水是个耗时操作(比如网络请求),洗碗和扫地是与视图相关的非耗时操作。洗碗和扫地必须由你本人亲自完成(视图相关的工作只能交给主线程),烧开水可以交给电磁炉完成,你只需要按下电磁炉的开关(可以类比成网络请求的发起)。没有使用异步也就意味着你在烧开水的时候一直在旁边等待着,无法完成其他工作,这也就意味着Android在等待网络请求的时候主线程阻塞,视图卡顿无法交互,这在Android中当然是不允许的。所以必须使用异步的方式,你(主线程)在按下电磁炉开关(发起网络请求)之后就继续完成洗碗扫地(视图交互)等其他任务了。
所以异步很好理解,就是同时进行着不同的任务就叫做异步。
2.为什么需要回调
当你按下电磁炉的按钮,并地利用这段时间完成了扫地的任务,你感到很有成就感。心里想:异步机制真好,原来25分钟的工作如今只需要15分钟就能完成,以后我任何的工作都要异步地完成。不过你并没有高兴太久,在洗碗时你遇到了麻烦。碗和盘子上沾满了油污,单靠自来水和洗洁精根本搞不定,这时你想到了别人教你的方法,常温的水洗不掉的油污用热水就可以轻松洗掉。但是你发现暖水瓶是空的,而放在电磁炉上的水刚烧了5分钟,还不够热,也就是说你必须等待水烧开了才能开始洗碗。
这时你不禁陷入了思考:异步机制真的是万能的吗?对于有前后依赖关系的任务,异步该如何处理呢?这段等待烧水的时间我可以去做其他工作吗?我怎么确定水什么时候才能烧开呢?这时,你眼前一亮:你发现了买水壶时赠送的一个配件,那是一个汽笛,它可以在水烧开的时候发出鸣叫声。听到了汽笛声你就可以知道水烧开了&#