当 Retrofit 赶上 LiveData

最近在学习 Google 官方的 GithubBrowserSample项目时,发现 Yigit Boyar 已经在项目里写好了一个 Adapter,用来链接 RetrofitLiveData。可是这种作法一直没有获得 Retrofit 项目的官方承认 ,时间点在 2017年左右,理由以下:java

  1. JakeWharton 认为把 Http 请求包装成 LiveData 包装很奇怪
  2. 当时 LiveData 刚被提出,各类 API 还不稳定
  3. Retrofit 的扩展机制给了开发者很大的空间去自定义各类集成方式,官方不适合去写死一些东西

随着 android architecture components 的日趋完善,愈来愈多的人开始转向使用 LiveData,进而享受到了 MVVM 模式的优秀之处。考虑到当时的时间点是 2017 年,随着以后 JakeWharton 本身也加入了 Google ,而且android architecture components 也早已发布正式版本,再加上 Google 官方的 Demo 里已经出现了这种写法,我以为是时候尝试一下了。android

我把官方 Demo 里的代码抽出了一个库,集成以后能够很方便地将 RetrofitLiveData 结合使用。git

项目地址

github.com/shawnlinboy…github

引用

implementation 'me.linshen.retrofit2:adapter-livedata:1.0.0'
复制代码

用法

Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(LiveDataCallAdapterFactory())
            .build()
            .create(GithubService::class.java)
            .getUser("shawnlinboy").observe(this,
                Observer { response ->
                    when (response) {
                        is ApiSuccessResponse -> {
                          //success response
                        }
                        else -> {
                            //failed response
                        }
                    }
                })
复制代码

说明

目前使用 RetrofitLiveData 结合最大的“问题”就在于,LiveData 自己是对数据类的包装,或者一个 Observable,没有 Callback 的概念,所以须要一个 ApiResponse 来承载一下,好把 Body 放进去,所以在用起来最外层始终会是 ApiResponse编程

其实坦白讲,在挪完这个库、写完 Demo 以后,我以为这种方法比与 RxJava 的结合真的简单太多了。尽管我依旧不否认 RxJava是一个很是优秀的库,而且我如今手上的项目里也还有不少地方须要依赖 RxJava 来帮我调度,但我始终以为 RxJava 对新手是在是太不友好了,主要是上手成本过高:一来你的编程思惟须要向响应式方向转变一下,二来RxJava 超多的运算符也确实让我团队里的不少小伙伴喝了一壶,常常用错,有些甚至是上线后才发现原来用的这个运算符有问题,应该换另一个。api

我会在接下来的一些项目里尽量采用RetrofitLiveData 结合的方式,看会不会有一些卡壳的场景。若是你们有更好的写法或者想法,也欢迎提出,欢迎 PR。学习

相关文章
相关标签/搜索