简介
在项目中,经常会遇到这样的场景:
1. 页面消失,网络请求依然存在,不光占用内存,而且还会导致内存泄露,久而久之占用内存越来越大,越来越卡。
2. 异步网络请求一大堆的CallBack,让你不得不多写N段代码。
现在好了,下面通过对Retrofit的扩展,让你摆脱这些痛苦
框架设计
框架图
如图:拓展Retrofit实现LifecycleObserver接口,感知Activity的生命周期全靠它了,加入kotlin.Coroutines协成库,让Retrofit异步变同步。
框架类结构设计:
类图
设计上,是对Retrofit CallAdapterFactory的扩展,并没有做源码的改动,这源于Retrofit好的设计,易扩展,如果原有项目已经使用了Retrofit,可以通过该方法将这套框架引入到项目中如图所示:
图
CallExt 是对Retrofit 的协程扩展,具体代码如下:
扩展
对LifecycleCall 扩展 await函数,该函数就是与协程组合在一起,将异步操作的结果交给协程处理,最终同步返回。具体想了解协程的推荐去这里看看:地址具体如何使用呢?请往下看:
使用方法
添加依赖
//coroutines 协程支持库
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.19.1'//lifecycle 生命周期观察者
implementation "android.arch.lifecycle:extensions:$lifecycleVersion"
kapt "android.arch.lifecycle:compiler:$lifecycleVersion"//很好用的Api输出框架
debugImplementation 'com.readystatesoftware.chuck:library:1.1.0'
releaseImplementation 'com.readystatesoftware.chuck:library-no-op:1.1.0'// Retrofit 扩展库,就是这次的主角
compile 'com.pape:net:1.0.2@aar'
ApiService 使用:需要使用LifecycleCall<T> 替代原本的Call<T>
接口定义
界面调用:只需要在原有的基础之上,添加 .await() 方法调用 即可实现同步获取结果,这就是协程的效果,而且该网络还会跟进传入context的生命周期结束的时候,自动释放网络请求。
调用
就这几步就搞定了。具体每个类的实现还需你去看源码,地址
测试如图:日志显示已经成功劫持网络,在页面结束的同时,结束网络请求。
总结
目前处于测试阶段,在经过一段时间的使用以及反馈之后,才会正常投入使用,不过不会有大问题存在,放心使用。相信在未来,kotlin协程在项目中会越来越多的应用,我们期待这一天早点到来。