最近在学习RxJava以及Retrofit,根据所学封装了一个带ProgressBarT弹窗网络请求的demo。并且对过程进行封装,只返回结果。当然只返回结果的json格式主要是针对:
{
"code" : "1",
"msg" : "",
"result" : [{}]
}
格式,有的格式可能不太一样,不过可以自己去封装超类。
主要框架:MVP+RxJava+Retrofit。
GitHub地址:https://github.com/JiangAndroidwork/RetrofitOfRxJava
接下来进入正文:
1,添加依赖
在工程的build.gradle中添加
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
在mould的build.gradle中添加
dependencies {
compile 'com.github.JiangAndroidwork:RetrofitOfRxJava:v1.4'
}
gradle请看github上面的最新版本
这里面涉及到Retrofit和RxJava的用法,如果不是很清楚的可以去看:
RxJava:http://gank.io/post/560e15be2dca930e00da1083
Retrofit:http://square.github.io/retrofit/
2,如果想要返回结果根据json格式利用GsonFormat插件生成bean类,继承BaseReponseResult.class.(如果想要返回全部数据就不需要继承BaseReponseResult)
BaseResponseResult.class格式如下:
public class BaseReponseResult<T>{
@Override
public String toString() {
return "BaseReponse{" +
"code='" + code + '\'' +
", msg='" + msg + '\'' +
'}';
}
private T result;
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
private String code;
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
有三个成员变量,code和msg是json固定的格式,而泛型T就是结合Retrofit和Rxjava使用的“result”数据,目的就是为了要封装过程,包括判断code是否为“1”这些过程,只返回需要的结果。
3,想要使用Retrofit需要在一个接口文件里面填写相应的头信息,请求参数等。我把这些都放在了RetrofitMethodsInterface.class接口中,
public interface RetrofitMethodsInterface {
@GET("getGradeExams")
Flowable<TestBean> getRetrofitData(@Query("classId") int classId, @Query("accessToken") String accessToken);
@GET("top250")
Flowable<TestHttp> getRetrofitData(@Query("start") int start, @Query("count") int count);
@GET("getCourseListApp")
Flowable<BaseReponseResult<List<TestBean.ResultEntity>>> getRequest(@Query("accessToken") String accessToken,
@Query("weekly") int weekly);
@GET("examGetMyInfo")
Flowable<BaseReponseResult<List<GetInfo.ResultEntity>>> getExamGetMyInfo(@Query("accessToken") String accessToken);
}
之后所有的接口请求参数等都放在这个接口类中。
在这里我们就可以清楚的看到接口返回的数据类型都是Flowable<T>,所以RxJava和Retrofit的结合就是体现在这里,通过Retrofit请求到的数据都可以以RxJava中被观察者Flowable<T>类型返回,然后通过subScribe订阅最后输出结果,好处就是可以对结果数据进行各种处理以及实现异步。
4,通过ProgressBarOfRetrofit.getInstance()实现网络请求:
ProgressBarOfRetrofit ss =
ProgressBarOfRetrofit.getInstance(this, "sss", new RetrofitOfRxJavaCallBack() { @Override public void callBack(Retrofit retrofit) { retrofit.create(RetrofitMethodsInterface.class) .getRetrofitData(5,"9969171b881c7f74c32558e11b86936f") .delay(5, TimeUnit.SECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new ApiSubscriber<TestBean>() { @Override protected void onError(String msg) { } @Override protected void onSuceess(TestBean testBean) { } }); } });
ss.setStart(false);
RetrofitOfRxJavaCallBack接口返回的是Retrofit类型,因为我想这样可以高自由度的去处理返回数据。getRetrofitData()方法就是service接口中的 请求方法,最后订阅实现订阅者ApiSubscriber<T>得到数据,最后ProgressBarOfRetrofit 对象引用需要调用setStart(false)方法完成整个请求过程,里面的参数是设置是否需要缓存。因为ProgressBarOfRetrofit对象我采用的是单例设计模式,这样可以保证只有一个对象的引用,在对异常处理时可以通过获取引用判断不同的状态实现弹窗的隐藏和显示。
上面是获取全部的数据,v1.3版本我将过程进行封装只返回“result”数据,可以通过添加
.map(new ApiFunction<T>())
这就是Rxjava的好处通过操作符对数据进行处理来得到想要的结果,这里ApiFunction<T>实现订阅者Function<T,T>:
public class ApiFunction<T> implements Function<BaseReponseResult<T>,T> {
@Override
public T apply(BaseReponse<T> tBaseReponse) throws Exception {
if (!tBaseReponse.getCode().equals("1")){
throw new ApiException(Integer.parseInt(tBaseReponse.getCode()),tBaseReponse.getMsg());
}
return tBaseReponse.getResult();
}
}
BaseReponseResult<T>就是json格式的超类,这是用来封装code是否为“1”的过程,当不为“1”时我们将msg传递给ApiException,当为“1”时返回T类型的数据。此时订阅者的数据类型就是T了。也就是我们在RetrofitMethodsInterface 接口中定义的类型,然后就可以进行相应的处理,不用去管各种网络异常的处理和code的处理,节省代码量。
依赖库整个采用MVP模式,我将ProgressBar放在了ProgressBarOfRetrofit类中,主要处理弹窗的显示与关闭,将网络获取请求的代码都放在了RetrofitHttp类中,主要通过Retrofit获取网络,并通过接口回调给"Presenter"也就是RetrofitPresenter类,主要负责获取“view”和“model”的引用并对数据进行传递。