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