×

Retrofit + 协程 + Lifecycle 封装实战

96
Pape
2017.12.20 12:39* 字数 681

简介

在项目中,经常会遇到这样的场景:
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协程在项目中会越来越多的应用,我们期待这一天早点到来。

日记本
Web note ad 1