GMTC2018 《领略 Kotlin 协程的力量》 张涛
2020-03-01 187浏览
- 1.领略略 Kotlin 协程的⼒力力量量 张涛
- 2.
- 3.
- 4.张涛 饿了么 Android 博客:开源实验室 微信:kymjs123
- 5.协程是什么
- 6.⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼀次执⾏⼀个任务
- 7.⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ ⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜⼜ 你执⾏⼀会,他执⾏⼀会
- 8.单CPU时间分⽚ 1234567890qwertyuiop asdfghjkl;’ zxcvbnm,./ 多CPU并⾏执⾏ 1234567890qwertyuiop asdfghjkl; zxcvbnm,./ 并发执⾏更多任务
- 9.main thread1 thread2 thread3
- 10.main thread1 thread2 検⬿
- 11.main thread1 thread2 ↅⓛ %27
- 12.通过提升 CPU 利⽤率,减少线程切换 进⽽提升程序运⾏效率
- 13.可控制:协程能做到可被控制的发起⼦任务 轻量级:协程⾮常⼩,占⽤资源⽐线程还少 语法糖:使多任务或多线程切换不再使⽤回调语法
- 14.通过 Kotlin 在 JVM 平台使⽤协程
- 15.⽰例:第三⽅登录 fun signinWith() { val token = requestToken() val user = requestUserInfo(token) setText(user.name) }
- 16.⽰例:第三⽅登录 fun signinWith() { val token = requestToken() val user = requestUserInfo(token) setText(user.name) }
- 17.⽰例:第三⽅登录 fun signinWith() { val token = requestToken() val user = requestUserInfo(token) setText(user.name) }
- 18.fun signinWith() { requestToken{ token -> requestUserInfo(token){user -> setText(user.name) } } }
- 19.fun signinWith() { requestToken{ token -> requestUserInfo(token){user -> setText(user.name) } } }
- 20.⽤协程实现
- 21.fun signinWith() = runBlocking { val token = requestToken() val user = requestUserInfo(token) setText(user.name) }
- 22.fun signinWith() = runBlocking { val token = requestToken() val user = requestUserInfo(token) setText(user.name) }
- 23.启动协程 • runBlocking : T • launch : Job // ⽤用于执⾏行行协程任务, 通常只⽤用于启动最外层协程 // ⽤用于执⾏行行协程任务 • async/await : Deferred // ⽤用于执⾏行行协程任务,并得到执⾏行行结果
- 24.fun setText(name:String) = launch(UI) { textView.text = name } suspend fun requestToken() = async(CommonPool) { return@async "curlhttp://www.example.com” }.await()
- 25.suspend fun requestToken() = async(CommonPool) { return@async "curlhttp://www.example.com” }.await()
- 26.suspend 关键字 suspend 修饰的函数(或 lambda), 只能被 suspend 修饰的函数(或 lambda)调⽤用
- 27.suspend suspend fun requestToken(): String { … } Object requestToken(Continuationc) { … }
- 28.Continuation suspend fun requestToken(): String { … } Object requestToken(Continuationc) { … } interface Continuation{ valcontext:CoroutineContext fun resume(e:'>value: