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

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

1 .请求的API

public interface MyApi {

    /**
     * 获取列表信息
     * @param createdate
     * @param code
     * @return
     */
    @GET("getusedserialwarcardlist.ashx")
    Observable>> getRecordList(@Query("createdate") String createdate, @Query("Code") String code );

    /**
     * 根据胎号获取具体的其他信息
     */

    @GET("getusedserialwarcardinfo.ashx")
    Observable> getRecordDetail1(@Query("couponnumber") String couponnumber );

    /**
     * 根据胎号获取规格和花纹
     * @param serialnumber
     * @return
     */
    @GET("gettirejson.ashx")
    Observable> getRecordDetail2(@Query("serialnumber") String serialnumber); 
}

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


public class ResponseData {

    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, Observable>>() {
                    @Override
                    public Observable> call(ResponseData checkDetailsDataResponseData) {
                        return request.getMyApi().getRecordDetail2(checkDetailsDataResponseData.getData().getSerialNumber());
                    }
                })
                .flatMap(new Func1, Observable>>>() {
                    @Override
                    public Observable>> call(ResponseData tyreDataResponseData) {
                        return request.getMyApi().getRecordList("2017-05-23", "s06600008ls");
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer>>() {
                    @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> response) {
                        mDialog.dismiss();
                        List 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,每一次都要写,应该是开始某处统一处理为好。下次修改。

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

你可能感兴趣的:(Retrofit)