当 Retrofit 遇上 LiveData

3,121 阅读2分钟

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

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

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

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

项目地址

github.com/shawnlinboy…

引用

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 超多的运算符也确实让我团队里的很多小伙伴喝了一壶,经常用错,有些甚至是上线后才发现原来用的这个运算符有问题,应该换另外一个。

我会在接下来的一些项目里尽可能采用RetrofitLiveData 结合的方式,看会不会有一些卡壳的场景。如果大家有更好的写法或者想法,也欢迎提出,欢迎 PR。