Rx系列学习笔记_RxJava+Retrofit进行简单请求

来源:互联网 发布:4g网络dns劫持 编辑:程序博客网 时间:2024/06/07 11:39

之前简单的学习了一下Rxjava的一些方法,现在来通过请求数据来继续学习。

1 .请求的API

public interface MyApi {    /**     * 获取列表信息     * @param createdate     * @param code     * @return     */    @GET("getusedserialwarcardlist.ashx")    Observable<ResponseData<List<RecordData>>> getRecordList(@Query("createdate") String createdate, @Query("Code") String code );    /**     * 根据胎号获取具体的其他信息     */    @GET("getusedserialwarcardinfo.ashx")    Observable<ResponseData<CheckDetailsData>> getRecordDetail1(@Query("couponnumber") String couponnumber );    /**     * 根据胎号获取规格和花纹     * @param serialnumber     * @return     */    @GET("gettirejson.ashx")    Observable<ResponseData<TyreData>> getRecordDetail2(@Query("serialnumber") String serialnumber); }

ResponseData用来包裹返回数据外层的一些状态码和错误信息

public class ResponseData<T> {    private String ErrorCode;    private String ErrorMsg;    private String Status;    private T Data;    public String getErrorCode() {        return ErrorCode;    }    public void setErrorCode(String ErrorCode) {        this.ErrorCode = ErrorCode;    }    public String getErrorMsg() {        return ErrorMsg;    }    public void setErrorMsg(String ErrorMsg) {        this.ErrorMsg = ErrorMsg;    }    public String getStatus() {        return Status;    }    public void setStatus(String Status) {        this.Status = Status;    }    public T getData() {        return Data;    }    public void setData(T Data) {        this.Data = Data;    }}

retrofit请求类,不忘忘记网络权限。

public class RetrofitRequest {    private static String baseUrl="xxxxxxx";    private static RetrofitRequest instance;    private static Retrofit.Builder retrofitBuild;    private static Retrofit retrofit;    private static  MyApi myApi;    public static RetrofitRequest getInstance() {        if (instance == null) {            synchronized (RetrofitRequest.class) {                if (instance == null) {                    instance = new RetrofitRequest();                    retrofitBuild = new Retrofit.Builder();                    retrofitBuild.baseUrl(baseUrl);                    retrofitBuild.addCallAdapterFactory(RxJavaCallAdapterFactory.create());                    retrofitBuild.addConverterFactory(GsonConverterFactory.create(new Gson()));                    retrofitBuild.addConverterFactory(ScalarsConverterFactory.create());                    retrofit = retrofitBuild.build();                    myApi = retrofit.create(MyApi.class);                }            }        }        return instance;    }    public MyApi getMyApi() {        if (myApi == null) {            myApi = retrofit.create(MyApi.class);        }        return myApi;    }    public void setBaseUrl(String baseUrl) {        this.baseUrl = baseUrl;    }}

现在来实现一个简单的请求,3个接口,接口2需要接口1的参数,然后3和1,2无关

  final RetrofitRequest request = RetrofitRequest.getInstance();        request.getMyApi().getRecordDetail1("5R2XMCR9TR")                .flatMap(new Func1<ResponseData<CheckDetailsData>, Observable<ResponseData<TyreData>>>() {                    @Override                    public Observable<ResponseData<TyreData>> call(ResponseData<CheckDetailsData> checkDetailsDataResponseData) {                        return request.getMyApi().getRecordDetail2(checkDetailsDataResponseData.getData().getSerialNumber());                    }                })                .flatMap(new Func1<ResponseData<TyreData>, Observable<ResponseData<List<RecordData>>>>() {                    @Override                    public Observable<ResponseData<List<RecordData>>> call(ResponseData<TyreData> tyreDataResponseData) {                        return request.getMyApi().getRecordList("2017-05-23", "s06600008ls");                    }                })                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<ResponseData<List<RecordData>>>() {                    @Override                    public void onCompleted() {                        Log.i("yqy", "get请求完成");                    }                    @Override                    public void onError(Throwable e) {                        mDialog.dismiss();                        Log.i("yqy", "get请求错误" + e.getMessage());                        //这里是在mainThread所以可以toast                        Toast.makeText(MainActivity.this, "请求失败:" + e.getMessage(), Toast.LENGTH_LONG).show();                    }                    @Override                    public void onNext(ResponseData<List<RecordData>> response) {                        mDialog.dismiss();                        List<RecordData> data = response.getData();                        requstContent.setText("请求的数据总数是:" + data.size());                    }                });

简单的来看看这个代码,先是去获取到APi,然后getRecordDetail1()返回一个
Observable,接着再flatMap,这里调用接口2,将接口1 的可观察对象转出接口2的可观察对象,然后再flatMap这里请求接口3.将接口2的可观察对象转成接口3的可观察对象。然后设置请求数据的线程和最终相应数据的线程。.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())。最后subscribe从下往上依次执行。这里可以参考大头鬼译文哪里对这个讲的清楚一些。最后看一下代码,最明显的就是这个外层包裹的ResponseData,每一次都要写,应该是开始某处统一处理为好。下次修改。

以上,不对的地方请指出非常感谢。

原创粉丝点击