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