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」