内容简介:本文基于RxJava、Retrofit的使用,若是对RxJava或Retrofit还不了解的简友可以先了解RxJava、Retrofit的用法再来看这篇文章。在这片文章之前分别单独介绍过Rxjava以及Retrofit的使用:
前言
本文基于RxJava、Retrofit的使用,若是对RxJava或Retrofit还不了解的简友可以先了解RxJava、Retrofit的用法再来看这篇文章。
在这片文章之前分别单独介绍过Rxjava以及Retrofit的使用:
(以及后面的几篇,就不一一列出了)
使用
在了解了RxJava和Retrofit分别的用法后,RxJava、Retrofit的搭配使用也就不再话下了。
先看看使用Retrofit完成一次网络请求是怎样的
- 单独使用Retrofit
1、先写一个service
interface MyService {
@GET("user/login" )
Call<UserInfo> login(
@Query("username") String username,
@Query("password") String password
);
}
2、获取Call执行网络请求
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build();
MyService service = retrofit.create(MyService.class);
Call<UserInfo> call = service.login("1111", "ssss");
call.enqueue(new Callback<UserInfo>() {
@Override
public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {
//请求成功操作
}
@Override
public void onFailure(Call<UserInfo> call, Throwable t) {
//请求失败操作
}
});
以上是Retrofit单独使用时的做法。那Retrofit与RxJava结合是怎样使用的?下面就来说说这篇文章的重点。
- RxJava + Retrofit完成网络请求
1、添加依赖。前四个分别是RxJava、RxAndroid、Retrofit以及Gson的库,最后那个才是新加入的,RxJava + Retrofit的使用需要用到最后那个包。
compile 'io.reactivex:rxjava:x.y.z'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
注意:最后三个包的版本号必须一样,这里用的是2.0.2。
2、写一个登录的service
interface MyService {
@GET("user/login" )
Observable<UserInfo> login(
@Query("username") String username,
@Query("password") String password
);
}
相比之前的service,这里getNews方法的返回值是Observable类型。Observable...是不是觉得很熟悉,这货不就是之前在RxJava使用到的被监听者?
3、使用Observable完成一个网络请求,登录成功后保存数据到本地。
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新的配置
.baseUrl(BASE_URL)
.build();
MyService service = retrofit.create(MyService.class);
service.login(phone, password) //获取Observable对象
.subscribeOn(Schedulers.newThread())//请求在新的线程中执行
.observeOn(Schedulers.io()) //请求完成后在io线程中执行
.doOnNext(new Action1<UserInfo>() {
@Override
public void call(UserInfo userInfo) {
saveUserInfo(userInfo);//保存用户信息到本地
}
})
.observeOn(AndroidSchedulers.mainThread())//最后在主线程中执行
.subscribe(new Subscriber<UserInfo>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
//请求失败
}
@Override
public void onNext(UserInfo userInfo) {
//请求成功
}
});
RxJava + Retrofit 形式的时候,Retrofit 把请求封装进 Observable ,在请求结束后调用 onNext() 或在请求失败后调用 onError()。
可以看到,调用了service的login方法后得到Observable对象,在新的线程中执行网络请求,请求成功后切换到io线程执行保存用户信息的动作,最后再切换到主线程执行请求失败onError()、请求成功onNext()。整体的逻辑十分清晰都在一条链中,就算还有别的要求还可以往里面添加,丝毫不影响代码的简洁。(终于举了一个有实际意义的例子)
注意 :retrofit的初始化加了一行代码
addCallAdapterFactory(RxJavaCallAdapterFactory.create())
- RxJava + Retrofit 进阶
在上面举到登录后保存用户信息的例子,其实在做项目的时候,往往在登录后得到的并不是用户信息。一般登录后会得到token,然后根据token去获取用户的信息。他们的步骤是这样的:
1、登录
2、获取用户信息(前提:登录成功)
可以看得出来,这是一个嵌套的结构...嵌套啊!!!天呐,最怕嵌套的结构了。
使用RxJava + Retrofit来完成这样的请求(借用 抛物线的例子 ,稍微做了点改动)
//登录,获取token
@GET("/login")
public Observable<String> login(
@Query("username") String username,
@Query("password") String password);
//根据token获取用户信息
@GET("/user")
public Observable<User> getUser(
@Query("token") String token);
//..................................
service.login("11111", "22222")
.flatMap(new Func1<String, Observable<User>>() { //得到token后获取用户信息
@Override
public Observable<User> onNext(String token) {
return service.getUser(token);
})
.subscribeOn(Schedulers.newThread())//请求在新的线程中执行请求
.observeOn(Schedulers.io()) //请求完成后在io线程中执行
.doOnNext(new Action1<User>() { //保存用户信息到本地
@Override
public void call(User userInfo) {
saveUserInfo(userInfo);
}
})
.observeOn(AndroidSchedulers.mainThread())//在主线程中执行
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
//完成一次完整的登录请求
userView.setUser(user);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable error) {
//请求失败
}
});
通过一个flatMap()轻松完成一次嵌套的请求,而且逻辑十分清晰。so easy~~~
小结
RxJava的实用性从上面的两个例子慢慢体现了出来,逻辑越是复杂,RxJava的优势就越明显。RxJava的使用就暂时介绍到这里吧,使用过程中遇到好用的再出来跟大家分享。
以上有错误之处感谢指出
(本文部分内容引用自该博客)
以上所述就是小编给大家介绍的《【Android】RxJava + Retrofit完成网络请求》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Usability for the Web
Tom Brinck、Darren Gergle、Scott D. Wood / Morgan Kaufmann / 2001-10-15 / USD 65.95
Every stage in the design of a new web site is an opportunity to meet or miss deadlines and budgetary goals. Every stage is an opportunity to boost or undercut the site's usability. Thi......一起来看看 《Usability for the Web》 这本书的介绍吧!