前言
Rxjava2这种通过观察者模式来处理异步问题,使得网络请求变得更容易,目前Rxjava2越来越火,也成为了不少框架用于异步处理的首选开源库。所以熟练掌握其基本用法也就成为了每个程序员应该具备的本领。
Gradle中添加依赖
//Rxjava
compile 'io.reactivex.rxjava2:rxandroid:2.0.2'
compile 'io.reactivex.rxjava2:rxjava:2.1.9'
//网络请求
compile 'com.squareup.retrofit2:retrofit:2.3.0' // retrofit
compile 'com.google.code.gson:gson:2.8.2' // gson
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'//RxJava2CallAdapterFactory适配器支持Rxjava2
// compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' RxJavaCallAdapterFactory适配器仅支持Rxjava
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
注意:如果使用RxJavaCallAdapterFactory适配器则有可能出现Unable to create call adapter for io.reactivex.Observable<okhttp3.ResponseBody>这个异常。
Retrofit2接口
public interface RequestServices {
@GET//定义返回的方法,返回的响应体使用了ResponseBody
Observable<ResponseBody> getString(@Url String url);
@FormUrlEncoded
@POST
Observable<ResponseBody> post(@Url String url, @FieldMap Map<String, String> params);
}
关于Retrofit2的使用Retrofit2网络请求详解可以查看这篇文章
初始化Retrofit对象
在这里我只是对Retrofit做了简单处理,如果有需求可以查看一下okhttp+Retrofit的配合使用
OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.build();
//获取Retrofit对象,设置地址
retrofit = new Retrofit.Builder()
.baseUrl("http://localhost")
.client(OK_HTTP_CLIENT)//通过okhttp对retrofit进行加强
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加Rxjava2适配器
.build();
网络请求
通过Retrofit对象创建出网络请求对象,通过该对象获取Observable对象,接下来就可以运用Rxjava的操作对数据进行处理
RequestServices requestServices = retrofit.create(RequestServices.class);
Map<String, String> pamars1 = new HashMap<>();
pamars1.put("key", "value");
requestServices.post("请求url地址",pamars1)//这里我们即可获得一个Observable对象,这里我使用的是post请求
.subscribeOn(Schedulers.io())//在io线程中做请求
.observeOn(AndroidSchedulers.mainThread())//主线程显示数据
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
Log.d(TAG,responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
合并多个网络请求
RequestServices requestServices = retrofit.create(RequestServices.class);
Map<String, String> pamars1 = new HashMap<>();
pamars1.put("key", "value");
Map<String, String> pamars2 = new HashMap<>();
pamars2.put("key", "value");
requestServices.post("请求url地址",pamars1)//这里我们即可获得一个Observable对象
.mergeWith(requestServices.post("请求url地址",pamars2))//合并两条网络请求
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//主线程显示数据
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
Log.d(TAG,responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
嵌套请求
//嵌套请求
requestServices.post("https://free-api.heweather.com/s6/weather?parameters",pamars1)
.flatMap(new Function<ResponseBody, ObservableSource<ResponseBody>>() {
@Override
public ObservableSource<ResponseBody> apply(ResponseBody responseBody) throws Exception {
Log.d(TAG,responseBody.string());
return requestServices.post("https://free-api.heweather.com/s6/weather?parameters",pamars2);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//主线程显示数据
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
Log.d(TAG,responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
打包请求
//打包请求
Observable.zip(requestServices.post("https://free-api.heweather.com/s6/weather?parameters", pamars1),
requestServices.post("https://free-api.heweather.com/s6/weather?parameters", pamars2),
new BiFunction<ResponseBody, ResponseBody, ResponseBody>() {
@Override
public ResponseBody apply(ResponseBody responseBody, ResponseBody responseBody2) throws Exception {
//这里可以合并两个数据然后返回 返回结果将传递到订阅信息中
return null;
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//主线程显示数据
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
Log.d(TAG,responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});