前言:一般在异步链式请求中,需要用到标题中的3个三方库。注意先再build.gradle文件中先引入
//retrofit接口
public interface PresetServerInteraction {
/**
* 获取图片名称
*
* @return
*/
@POST("path_ova")
Observable<String> getPresetPicNameRxJava(@Body RequestBody requestBody);
}
MainActivity编写:
OkHttpClient client = new OkHttpClient().newBuilder()
.hostnameVerifier(SSLSocketClient.getHostnameVerifier())//配置
.build();
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://130.1.207.202:8302/")
.addConverterFactory(new Retrofit2ConverterFactory())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
final PresetServerInteraction apiService = retrofit.create(PresetServerInteraction.class);
//组装requestBody
RequestBody jsonReq = iPresetManager.getPresetPicName(presetDns, devId, preSetsBeanList);
Observable<String> observable1 = apiService.getPresetPicNameRxJava(jsonReq);
//请求数据必须切换到子线程
observable1.subscribeOn(Schedulers.io())
//请求完数据要更新UI 切换到主线程,因为这里用到了链式请求,故放在了最后
//.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<String>() {
@Override
public void accept(String myBean) throws Exception {
// Log.d("rxJava返回",myBean);
}
})
//flatMap链式请求
.observeOn(Schedulers.io())
.flatMap(new Function<String, ObservableSource<String>>() { // 作变换,即作嵌套网络请求
@Override
public ObservableSource<String> apply(String result) throws Exception {
// 将网络请求1转换成网络请求2,即发送网络请求2
return observable1; //这里还是用ob1订阅者作为样例,事实上一般是observable2
}
})
.observeOn(Schedulers.io())
.flatMap(new Function<String, ObservableSource<String>>() { // 作变换,即作嵌套网络请求
@Override
public ObservableSource<String> apply(String result) throws Exception {
// 将网络请求2转换成网络请求3,即发送网络请求3
return observable1; //这里还是用ob1订阅者作为样例,事实上一般是observable3
}
})
.observeOn(AndroidSchedulers.mainThread())
//subscribe在链式请求情况下必须写在最后
.subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String projectBean) throws Exception {
//Log.d("rxJava返回2",projectBean);
// 处理返回的数据
}
})
;
其中getPresetPicName的组装RequstBody方法:
public RequestBody getPresetPicName(String cts, String devId, ArrayList<DevConfigBean.PresetSettingBean.PreSetsBean> preSetsBeans) {
DeviceInfoBean deviceInfoBean = iAccountManager.getDeviceInfo(devId);
JSONObject jsonObject = new JSONObject();
jsonObject.put("sn", devId);
jsonObject.put("auth", deviceInfoBean.getAuth("css"));
JSONArray jsonArray = new JSONArray();
JSONObject jsonObj;
for (DevConfigBean.PresetSettingBean.PreSetsBean preSetsBean : preSetsBeans) {
jsonObj = new JSONObject();
jsonObj.put("chId", "1");
jsonObj.put("presetId", preSetsBean.getPresetId());
jsonArray.add(jsonObj);
}
jsonObject.put("presetInfo", jsonArray);
JSONArray JsonArray = new JSONArray();
JsonArray.add(jsonObject);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), JsonArray.toJSONString());
return requestBody;
}