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

时间:2020-12-10 17:46:49

之前简单的学习了一下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,每一次都要写,应该是开始某处统一处理为好。下次修改。

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