最近在學習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”的引用並對數據進行傳遞。