###相关文章
首先,我们需要在build.gradle文件中添加依赖
// Rx依赖
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
// retrofit
compile 'com.squareup.retrofit2:retrofit:2.3.0'
// r将retrofit结果转换为对象模型
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
// Rx与Retrofit结合依赖
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
接下来,我将通过案例的方式来介绍RxJava和Retrofit结合使用带来的便捷,并且与不使用RxJava方式作对比:
###案列服务器数据介绍
服务器我简单的使用的tomcat,获取俩个json字符串
主机地址使用我自己的ip地址http://192.168.1.123:8080/
登录接口为 retrofitDemo/login.json
获取用户接口为retrofitDemo/userInfo.json
获取到的json数据分别为
// 登陆成功
{"success":true,"message":"login success !","user_id":110}
// 获取用户信息‘
{"username":"dujun","head_url":"www.baidu.com","id":"110"}
###传统方式(不用RxJava方式) - 登录,并获取用户信息(仅用retrofit)案例
首相,创建Retrofit的Api接口,
/**
* description:
* author: dujun
* created at: 2018/1/10 11:54
* update: 2018/1/10
* version:
*/
public interface Api {
/**
* 登录
* @param userParam
* @return
*/
@POST("retrofitDemo/login.json")
Call login(@Body UserParam userParam);
/**
* 获取用户信息
* @param userParam
* @return
*/
@POST("retrofitDemo/userInfo.json")
Call getUserInfo(@Body UserParam userParam);
}
然后创建Retrofit,并创建Api
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.1.123:8080/")
// 添加Gson转换,结果将会自动转化为数据模型
.addConverterFactory(GsonConverterFactory.create())
.build();
api = retrofit.create(Api.class);
调用api中的登录方法登录,,登录成功后,再调用api中的获取用户信息接口,获取用户信息
public void login(View view){
api.login(new UserParam("dujun","123456")).enqueue(new Callback<BaseResult>() {
@Override
public void onResponse(Call<BaseResult> call, Response<BaseResult> response) {
// 获取请求结果,此处在ui线程
if(response != null){
BaseResult result = response.body();
// 登录成功,继续获取用户信息
api.getUserInfo(result.user_id).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User body = response.body();
// 获取用户信息,并显示在界面上
StringBuilder builder = new StringBuilder();
String userString = builder.append("head_url : " + body.head_url).append(" ").append("user_id : " + body.id).append(" ").append("username : " + body.username).toString();
mTv.setText(userString);
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
}
@Override
public void onFailure(Call<BaseResult> call, Throwable t) {
}
});
}
注:可以到这里去下载Gif图片录制软件
可以看到,首先通过retrofit登陆成功。获取到用户id。然后再次通过id去获取用户信息。并显示在界面上。
首相,我们要添加转换器
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.1.123:8080/")
// 添加Gson转换,结果将会自动转化为数据模型
.addConverterFactory(GsonConverterFactory.create())
// 添加RxJava转换
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
**注意:**不加或者参数类型不对,报异常: Could not locate call adapter for io.reactivex.Observable…
接下来,我们直接修改Api接口中方法的返回值为Observable
/**
* RxJava和Retrofit结合完成登录操作
* @param userParam
* @return
*/
@POST("retrofitDemo/login.json")
Observable loginWithRxJava(@Body UserParam userParam);
/**
* Rxjava和Retrofit结合完成获取用户信息操作
* @param
* @return
*/
@POST("retrofitDemo/userInfo.json")
Observable getUserInfoWithRxJava(@Body int userId);
在代码中调用方法, 注释中已经详细介绍。
public void loginRxJava(View view){
// 登录
api.loginWithRxJava(new UserParam("dujun", "123456"))
// flatMap转换操作,将BaseResult转换为ObservableSource>发射器(被观察者对象)
.flatMap(new Function<BaseResult, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(@NonNull BaseResult baseResult) throws Exception {
// 联网获取用户信息
Observable<User> observable1 = api.getUserInfoWithRxJava(baseResult.user_id);
return observable1;
}
})
// 将Observable执行的操作放在子线程(请求网络获取数据)
.subscribeOn(Schedulers.io())
// 将Observer执行的操作放在ui线程
.observeOn(AndroidSchedulers.mainThread())
// 注册绑定Observer
.subscribe(new Observer<User>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull User user) {
// 获取users数据,并显示在界面
StringBuilder builder = new StringBuilder();
String userString = builder.append("RxJava和Retrofit结合获取的数据:").append("head_url : " + user.head_url).append(" ").append("user_id : " + user.id).append(" ").append("username : " + user.username).toString();
mTv.setText(userString);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
注:可以到这里去下载Gif图片录制软件
从图中可以看出,俩中方式都获取到了最终的用户信息。
###写在后面
从上面的例子可以看出。Retrofit和Rxjava2结合使用方式,大大的简化了我们的代码,后期维护也变的很简单。
###一些实用工具文旦下载地址:
Gif图片录制软件:Gif图片录制软件,可以帮助录制电脑屏幕上任意大小内容任意时间长度,而且还可以自己调节内容,可以断点续录。
RxJava中文文档:Rxjava目前来说是非常流行的异步框架,掌握Rxjava可以在工作中得心应手,这里提供Rxjava中文文档。可以帮助你更好更快的掌握这项技术。
GifView(Gif图片播放器):Gif图片播放器,可以帮助你,像看电影一样,调节图播放的进度,而且还可以暂停播放
Android逆向助手:反编译别人的App是不道德的,但是,如果是为了纯粹的学习,提升自己,还是可以的,Android逆向助手,可以帮助你,获取到你想要的