最近在学习 Google 官方的 GithubBrowserSample
项目时,发现 Yigit Boyar 已经在项目里写好了一个 Adapter,用来连接 Retrofit
与 LiveData
。但是这种做法一直没有得到 Retrofit 项目的官方认可 ,时间点在 2017年左右,理由如下:
- JakeWharton 认为把 Http 请求包装成 LiveData 包装很奇怪
- 当时 LiveData 刚被提出,各种 API 还不稳定
- Retrofit 的扩展机制给了开发者很大的空间去自定义各种集成方式,官方不适合去写死一些东西
随着 android architecture components
的日趋完善,越来越多的人开始转向使用 LiveData
,进而享受到了 MVVM
模式的优秀之处。考虑到当时的时间点是 2017 年,随着之后 JakeWharton 自己也加入了 Google ,并且android architecture components
也早已发布正式版本,再加上 Google 官方的 Demo 里已经出现了这种写法,我觉得是时候尝试一下了。
我把官方 Demo 里的代码抽出了一个库,集成之后可以很方便地将 Retrofit
与 LiveData
结合使用。
项目地址
引用
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
}
}
})
说明
目前使用 Retrofit
与 LiveData
结合最大的“问题”就在于,LiveData
本身是对数据类的包装,或者一个 Observable
,没有 Callback
的概念,因此需要一个 ApiResponse 来承载一下,好把 Body
放进去,因此在用起来最外层始终会是 ApiResponse
。
其实坦白讲,在挪完这个库、写完 Demo 之后,我觉得这种方法比与 RxJava
的结合真的简单太多了。尽管我依旧不否定 RxJava
是一个非常优秀的库,并且我现在手上的项目里也还有很多地方需要依赖 RxJava
来帮我调度,但我始终觉得 RxJava
对新手是在是太不友好了,主要是上手成本太高:一来你的编程思维需要向响应式
方向转变一下,二来RxJava
超多的运算符也确实让我团队里的很多小伙伴喝了一壶,经常用错,有些甚至是上线后才发现原来用的这个运算符有问题,应该换另外一个。
我会在接下来的一些项目里尽可能采用Retrofit
与 LiveData
结合的方式,看会不会有一些卡壳的场景。如果大家有更好的写法或者想法,也欢迎提出,欢迎 PR。