Retrofit对协程的支持
@GET("users/{user}/repos")
suspend fun listReposKt(@Path("user") user :String);
val retrofit =Retrofit.Builder()
.baseUrl("https:api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api =retrofit.create(Api::class.java)
GlobalScope.launch(Dispatchers.Main) {
try{
val repos =api.listReposKt("allen") //后台
textView.text =repos[0].name //前台
}catch(e : Exception){
textView.text =e.message //抛出异常
}
}
协程和RxJava
1).都可以切线程
2).都不需要嵌套
3).都很强大,应用场景越来越接近
4).Rxjava 需要回调和包装,协程只需要在保证在协程里调用就行
协程和Architecture Components
1).协程泄露:本质上是线程泄露
另外,还记得课上讲的内存泄露的本质吗?
2).CoroutineScope: 【 结构化并发】,结构化管理协程
3).Lifecycle、ViewModel,LiveData,Room的支持:关键在于对【协程】的理解
协程和线程区别
1)协程和线程分别是什么?
线程就是线程,协程是一个线程库
2)协程和线程哪个容易使用?
当然是协程了:你作为一个上层库,你还没原型好使,那要你何用?
协程和Executor,哪个容易使用?
一般来说还是协程,这东西实在有点太突破了,关键就是它的【消除回调】
3).协程相比线程的优势和缺陷?
1).优势就是好用,强大:劣势呢?上手太难了
2).那么和Executor相比,有什么劣势
一样,难上手,没办法,它太新了。
那和Handler相比呢?
首先,其实没法比,它俩也不是一个纬度的东西。Handler相当于一个【只负责Android中切线程】的特殊场景化的Exector,在Android 中你要想让协程切到主线程,还是得用Handler.
如果我就是要强行对比协程和Handler,它有什么优劣?
我们要真是从易用性上面来说,你用协程来往主线程切,还真的是比直接用Handler更好写,更方便的。
总结:
1.协程是怎么切线程的?
最终还是使用了原生的线程切换(以及android的Handler)
2.协程为什么可以【从主线程挂起】,其实是结束了在主线程的执行,把后面的代码放在了后台线程执行, 以及在后台线程的工作做完后,再把更靠后的代码通过Handler.post()又抛回主线程。
3.协程的delay()和Thread.slep()
1).delay性能更好吗?
并没有更好
2)那它为什么不卡线程?
因为它只是不卡当前线程,而去卡了别的线程