Retrofit + 协程 + Lifecycle 封装实战

作者: i校长 | 来源:发表于2017-12-20 12:39 被阅读906次

    简介

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

    相关文章

      网友评论

      本文标题:Retrofit + 协程 + Lifecycle 封装实战

      本文链接:https://www.haomeiwen.com/subject/wdxgwxtx.html