简化RxJava+Retrofit2的封装

项目体验地址 https://github.com/HowardChenhaoyang/RetrofitPluginDemo

android-studio-plugin

该插件为了简化RxJava+Retrofit2的封装过程。

封装过程是一个持续优化的过程。如下:

使用RxJava+Retrofit2的开发过程中,需要对请求进行封装。
一般的封装流程:(kotlin代码)

    interface MemberService {
      @GET("xxxxxxx")
      fun memberList(): Observable<List<MemberBean>>
    }
    class MemberServiceImpl{
      fun memberList(): Observable<List<MemberBean>> {
        return retrofit.create(MemberService::class.java)
                       .memberList()
      }
    }

优化1: 访问网络都是需要在非UI线程进行,数据请求成功之后,在切换回UI线程进行处理,所以继续如下的封装,增加线程切换功能

    class MemberServiceImpl{
      fun memberList(): Observable<List<MemberBean>> {
        return retrofit.create(MemberService::class.java)
                       .memberList()
                       .subscribeOn(Schedulers.io())
                       .unsubscribeOn(Schedulers.io())
                       .observeOn(AndroidSchedulers.mainThread())
      }
    }

优化2: 多个请求的封装都会调用到线程切换的代码,因此可以抽离出来。

    class MemberServiceImpl{
      fun memberList(): Observable<List<MemberBean>> {
        return threadSwitch(retrofit.create(MemberService::class.java)
                       .memberList())
      }
      fun <T> threadSwitch(observable: Observable<T>): Observable<T>{
        return observable.subscribeOn(Schedulers.io())
                  .unsubscribeOn(Schedulers.io())
                  .observeOn(AndroidSchedulers.mainThread())
      }
    }

优化3: 优化2的封装中断了rxjava的链式调用,失去了代码的优雅性,因此借助Transformer操作符继续优化

    class MemberServiceImpl{
      fun memberList(): Observable<List<MemberBean>> {
        return retrofit.create(MemberService::class.java)
                       .memberList()
                       .compose(threadSwitch())
      }
      fun <T> threadSwitch(): Observable.Transformer<T, T>{
        return Observable.Transformer { observable ->
          observable.subscribeOn(Schedulers.io())
                    .unsubscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
        }
      }
    }

至此,该请求封装基本完成,当然也可以借助kotlin的扩展属性进一步优化。每次新增加接口都要重复如下步骤:
1.定义service文件: MemberService
2.定义请求方法:memberList
3.实现接口

其中1,2两步无法避免,优化的只有第3步,因此可以借助Intelli IDEA的插件化技术,彻底解放双手,自动生成第三步的代码。

该项目比较有参考意义,可以根据自己的需求进行定制。
体验demo前先安装插件(根目录下的RetrofitPlugin.jar)
插件项目地址:https://github.com/HowardChenhaoyang/android-studio-plugin

operation.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。