白话kotlin:用协程来愉快的处理异步问题

Coroutine(协程)是什么玩意?

协程名字听起来很玄乎,其实他是很简单的。
所谓协程,就是相互协作的程序。

为了做好一件事情,我们的程序要相互协作!

一个协程代表着:几段互相帮助,互相协作的代码。

举个简单的例子:
在Android中,我们在ui线程中做与界面相关的操作。
但我们经常会遇到磁盘的读写,网络的请求,这些繁琐耗时的操作我们是在另外一个线程的处理,等这些操作完成后,我们再把结果显示到界面上。

以上就是一种协作,总结下:

  1. ui线程把耗时操作的代码块交给其他线程来处理
  2. 其他线程处理处理完成后,把结果交付给ui线程显示

其实以上的例子就是所谓的异步问题
如何处理异步问题?
有很多种方法:

  1. 开启一起线程处理
  2. 利用AsyncTask
  3. 利用CallBack
  4. 利用RxJava

以上方法本质上都是在另外一个线程处理耗时的操作,只是写法上一个比一个先进一点,人性化一点。

OK,协程可以更加人性化,写出来的代码更加人性化一些,很直观的看出哪些代码在互相协作,看下面的对比:

协程 vs 回调

1. 异步计算

白话kotlin:用协程来愉快的处理异步问题_第1张图片

2. 异步UI

白话kotlin:用协程来愉快的处理异步问题_第2张图片

看了上面的例子,是不是感觉:
协程中最大的特色:将异步代码写的干净清晰!

协程的基本使用

  1. 启用一个协程


    白话kotlin:用协程来愉快的处理异步问题_第3张图片
  2. 启用一个可阻塞当下线程的协程


    白话kotlin:用协程来愉快的处理异步问题_第4张图片
  3. 主动去等待一个协程完成


    白话kotlin:用协程来愉快的处理异步问题_第5张图片
  4. 重构,将代码组织进一个函数内,这个函数被 suspend修饰


    白话kotlin:用协程来愉快的处理异步问题_第6张图片
  5. 其他:

  • 协程是可以被取消的和超时控制
  • 可以组合被挂起的函数
  • 协程中运行环境的指定,也就是线程的切换

具体的文档在这里:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md

协程的内部是如何工作的?

以下只是简单的说一说,来自官网

协程在编译阶段就完成了,它不需要虚拟机或者os的支持。

协程里面被挂起的任务是通过代码转换而成的。
每个可被挂起的函数,被增强为一个状态机:这个状态机记录当前函数所处环境的状态,若这个函数执行完毕,状态机依据当前的状态恢复被挂起之前的环境。

建议看下我的这篇文章:同步编程 vs 异步编程

关于协程中的API

kotlin中的协程目前还处于试验性阶段。
kotlin标准库提供了最基本的api。
想要使用一些奇技淫巧,目前有一些支持库可供参考:

  1. kotlinx.coroutines
  2. AsyncAwait

参考

  1. coroutines
  2. kotlinx.coroutines
  3. kotlin-coroutines-informal

文章写的还不完善,好多地方没有提到,后续继续更新。

白话kotlin系列

  1. 白话kotlin:向空指针异常说再见
  2. 白话kotlin:lambda表达式和高阶函数是什么玩意?
  3. 白话kotlin:内联函数助你提升运行效率
  4. 白话kotlin:用协程来愉快的处理异步问题
  5. 白话kotlin:有意思的拓展
  6. 白话kotlin:简单的理解 关键词object

你可能感兴趣的:(白话kotlin:用协程来愉快的处理异步问题)