Kotlin的协程

Kotlin的协程介绍

展开查看详情

1.Kotlin 的协程 Coroutines 扔物线 (朱凯) 扔物线学堂

2.协程是什什么?

3.在⽹网上搜「协程是什什么」

4. 在⽹网上搜「协程是什什么」 • 「协程和线程类似,是⼀一种在程序开发中处理理多任务的组件。」 • 「协程就像⼀一种轻量量级的线程。」 • 「协程很像线程,但它不不是线程。」 • 「协程是『⽤用户态』的,它的切换不不需要和操作系统交互,因此协程 切换的成本⽐比线程切换低。」 • 「协程由于是『协作式』的,所以不不需要线程的同步操作。」

5.协程是什什么

6. 协程是什什么 • 其实就是⼀一套由 Kotlin 官⽅方提供的线程 API。

7.// Thread Thread { ... }.start()

8.// Thread Thread { ... }.start() // Executor val executor = Executors.newCachedThreadPool() executor.execute { ... }

9.// Thread Thread { ... }.start() // Executor val executor = Executors.newCachedThreadPool() executor.execute { ... } // 协程 launch { ... }

10.协程好在哪?

11. 协程好在哪? • ⽅方便便

12.... val user = api.getUser() nameTv.text = user.name ...

13.... val user = api.getUser() // ⽹网络请求(后台线程) nameTv.text = user.name // 更更新 UI(主线程) ...

14.「⾮非阻塞式挂起」

15. ? 「⾮非阻塞式挂起」

16.协程⻓长什什么样

17.launch(Dispatchers.IO) { saveToDatabase(data) }

18.launch(Dispatchers.IO) { saveToDatabase(data) } launch(Dispatchers.Main) { updateViews(data) }

19.launch(Dispatchers.IO) { saveToDatabase(data) } launch(Dispatchers.Main) { updateViews(data) } thread { ... }

20.launch(Dispatchers.Main) { val user = api.getUser() nameTv.text = user.name }

21.launch(Dispatchers.Main) { // 开始:主线程 val user = api.getUser() // ⽹网络请求:后台线程 nameTv.text = user.name // 更更新 UI:主线程 }

22.launch(Dispatchers.Main) { // 开始:主线程 val user = api.getUser() // ⽹网络请求:后台线程 nameTv.text = user.name // 更更新 UI:主线程 }

23.launch(Dispatchers.Main) { // 开始:主线程 val user = api.getUser() // ⽹网络请求:后台线程 nameTv.text = user.name // 更更新 UI:主线程 } api.getUser() .enqueue(object : Callback<User> { ... override fun onResponse(call: Call<User>, response: Response<User>) { runOnUiThread { nameTv.text = response.body()?.name } } })

24.launch(Dispatchers.Main) { // 开始:主线程 val user = api.getUser() // ⽹网络请求:后台线程 nameTv.text = user.name // 更更新 UI:主线程 } api.getUser() .enqueue(object : Callback<User> { ... override fun onResponse(call: Call<User>, response: Response<User>) { runOnUiThread { nameTv.text = response.body()?.name } } })

25.launch(Dispatchers.Main) { val token = api.getToken() val user = api.getUser(token) nameTv.text = user.name }

26.launch(Dispatchers.Main) { // 开始:主线程 val token = api.getToken() // ⽹网络请求:后台线程 val user = api.getUser(token) // ⽹网络请求:后台线程 nameTv.text = user.name // 更更新 UI:主线程 }

27.api.getToken() .enqueue(object : Callback<Token> { ... override fun onResponse(call: Call<Token>, response: Response<Token>) { api.getUser() .enqueue(object : Callback<User> { ... override fun onResponse(call: Call<User>, response: Response<User>) { runOnUiThread { nameTv.text = response.body()?.name } } }) } })

28.api.getToken() .enqueue(object : Callback<Token> { ... override fun onResponse(call: Call<Token>, response: Response<Token>) { api.getUser() .enqueue(object : Callback<User> { ... override fun onResponse(call: Call<User>, response: Response<User>) { runOnUiThread { nameTv.text = response.body()?.name } } }) } })

29.协程的「1 到 0」