Rxjava+retrofit+okhttp使用

前言:一般在异步链式请求中,需要用到标题中的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;
    }

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值