(本文代码示例采用Kotlin编写)
1. 前言
此前我们一直是使用RxJava+Retrofit实现网络请求,直接使用这种请求方式是没有和Activity或Fragment的生命周期绑定的,就容易出现内存泄漏或者程序崩溃的情况。因此通常还会加上一个RxlifeCycle来保证和我们的生命周期绑定就变成了RxJava+Retrofit+RxLifeCycle这种结构了,但是自从Android官方推出了LiveData组件,因为LiveData是带有生命周期属性的,我们就可以抛弃原来的写法,来创造属于自己的一套网络请求框架,即下面要讲的LiveData+Retrofit这种模式。
2. RxJava+Retrofit的使用
我们先看下使用RxJava+Retrofit的请求方式是怎么样,
(这里以Github的接口为例)
2.1 准备工作
首先我们会创建一个接口
例如:
interface Api {
//获取账户信息
@GET("users/{account}")
fun getUserDetail(@Path("account") acccount: String?): Observable<GitHubUserBean>
}
这里我们想要的返回结果是这样的 Observable 里面包含了我们想要的返回对象GitHubUserBea
然后我们通过Retrofit来得到这个Api的实例
private val api: Api by lazy {
okHttpClient.addInterceptor(HttpLoggingInterceptor().apply {
setLevel(HttpLoggingInterceptor.Level.BODY)
})
val retrofit = Retrofit.Builder().baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(OkHttpClient())
.build()
retrofit.create(Api::class.java)
}
这里baseUrl= https://api.github.com/ ,可以从上面看到最后我们调用的接口地址应该是这样的 https://api.github.com/users/{account},其中account就是我们需要传入的Github账号。 这里我们随便找一个账号吧(JakeWharton)
然后准备工作我们就做好了,现在我们呢就可以请求接口了。 我们一般做法是这样
api.getUserDetail(account).subscribeOn(Schedulers.i