rxretrofitlibrary是一個已經寫好的網絡框架庫,先以本地Module導入到本身的項目中。json
一、它的初始化操做大多在自定義的application中完成,如:api
public class App extends Application { @Override public void onCreate() { super.onCreate(); //初始化網絡框架庫 RxRetrofitApp.init(this,true); } }
二、在rxretrofitlibrary下定義一個回調信息統一封裝類(即實際工做中網絡請求的返回json實體類),泛型T表示用戶真正關心的數據Data類,例如:緩存
/** * 回調信息統一封裝類 */ public class BaseResultEntity<T> { // 判斷標示 private int ret; // 提示信息 private String msg; //顯示數據(用戶須要關心的數據) private T data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } public int getRet() { return ret; } public void setRet(int ret) { this.ret = ret; } }
三、在項目中使用GsonFormat插件快速建立簡單的Data實體類cookie
public class Data { private String downurl; private String icoUri; private String name; private String packageName; public String getDownurl() { return downurl; } public void setDownurl(String downurl) { this.downurl = downurl; } public String getIcoUri() { return icoUri; } public void setIcoUri(String icoUri) { this.icoUri = icoUri; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } @Override public String toString() { return "name:"+name+",packageName:"+packageName ; } }
四、在項目下建立相應的網絡請求接口(@GET註解後帶的參數爲網絡請求url除BaseUrl部分,由於BaseUrl保存在了5中的請求同一封裝類中,便於管理)網絡
public interface HttpGetService { @GET("url") Observable<BaseResultEntity<Data>> getData(); }
五、爲了使用方便,在rxretrofitlibrary下再定義一個請求統一封裝類BaseApi,此處實現的Func1接口泛型爲BaseResultEntity<T>, T。若是在實際項目中,是爲了使用RxJava的map操做符將BaseResultEntity<T>轉換爲T。(轉換的方法重點在代碼最下面的call方法中,根據實際的業務邏輯來定)app
/** * 請求統一封裝 * @param <T> */ public abstract class BaseApi<T> implements Func1<BaseResultEntity<T>, T>{ //rx生命週期管理 private SoftReference<RxAppCompatActivity> rxAppCompatActivity; /*回調*/ private SoftReference<HttpOnNextListener> listener; /*是否能取消加載框*/ private boolean cancel; /*是否顯示加載框*/ private boolean showProgress; /*是否須要緩存處理*/ private boolean cache; /*基礎url*/ private String baseUrl = "http://192.168.0.101:8080/"; /*方法-若是須要緩存必須設置這個參數;不須要不用設置*/ private String mothed; /*超時時間-默認6秒*/ private int connectionTime = 6; /*有網狀況下的本地緩存時間默認60秒*/ private int cookieNetWorkTime = 60; /*無網絡的狀況下本地緩存時間默認30天*/ private int cookieNoNetWorkTime = 24 * 60 * 60 * 30; /* 失敗後retry次數*/ private int retryCount = 1; /*失敗後retry延遲*/ private long retryDelay = 100; /*失敗後retry疊加延遲*/ private long retryIncreaseDelay = 10; public BaseApi(HttpOnNextListener listener, RxAppCompatActivity rxAppCompatActivity) { setListener(listener); setRxAppCompatActivity(rxAppCompatActivity); setShowProgress(false); setCache(false); setCancel(true); setCookieNetWorkTime(60); setCookieNoNetWorkTime(24*60*60); } /** * 設置參數 * * @param retrofit * @return */ public abstract Observable getObservable(Retrofit retrofit); public int getCookieNoNetWorkTime() { return cookieNoNetWorkTime; } public void setCookieNoNetWorkTime(int cookieNoNetWorkTime) { this.cookieNoNetWorkTime = cookieNoNetWorkTime; } public int getCookieNetWorkTime() { return cookieNetWorkTime; } public void setCookieNetWorkTime(int cookieNetWorkTime) { this.cookieNetWorkTime = cookieNetWorkTime; } public String getMothed() { return mothed; } public int getConnectionTime() { return connectionTime; } public void setConnectionTime(int connectionTime) { this.connectionTime = connectionTime; } public void setMothed(String mothed) { this.mothed = mothed; } public String getBaseUrl() { return baseUrl; } public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } public String getUrl() { return baseUrl + mothed; } public void setRxAppCompatActivity(RxAppCompatActivity rxAppCompatActivity) { this.rxAppCompatActivity = new SoftReference(rxAppCompatActivity); } public boolean isCache() { return cache; } public void setCache(boolean cache) { this.cache = cache; } public boolean isShowProgress() { return showProgress; } public void setShowProgress(boolean showProgress) { this.showProgress = showProgress; } public boolean isCancel() { return cancel; } public void setCancel(boolean cancel) { this.cancel = cancel; } public SoftReference<HttpOnNextListener> getListener() { return listener; } public void setListener(HttpOnNextListener listener) { this.listener = new SoftReference(listener); } public int getRetryCount() { return retryCount; } public void setRetryCount(int retryCount) { this.retryCount = retryCount; } public long getRetryDelay() { return retryDelay; } public void setRetryDelay(long retryDelay) { this.retryDelay = retryDelay; } public long getRetryIncreaseDelay() { return retryIncreaseDelay; } public void setRetryIncreaseDelay(long retryIncreaseDelay) { this.retryIncreaseDelay = retryIncreaseDelay; } /* * 獲取當前rx生命週期 * @return */ public RxAppCompatActivity getRxAppCompatActivity() { return rxAppCompatActivity.get(); } @Override public T call(BaseResultEntity<T> httpResult) { //map 定義轉換規則 if (httpResult.getRet() == 0) {//0失敗,1成功 throw new HttpTimeException(httpResult.getMsg()); } return httpResult.getData(); } }
六、在項目下建立子類DataApi來繼承5中的請求統一封裝類框架
public class DataApi extends BaseApi<Data> { public DataApi(HttpOnNextListener listener, RxAppCompatActivity rxAppCompatActivity) { super(listener, rxAppCompatActivity); //容許緩存 setCache(true); //緩存的標誌 setMothed("AppStore/test"); } @Override public Observable getObservable(Retrofit retrofit) { HttpGetService httpGetService = retrofit.create(HttpGetService.class); return httpGetService.getData(); } }
七、最終在繼承自RxAppCompatActivity(由於RxJava須要控制生命週期)的子Activity中調用來獲得網絡請求數據ide
DataApi api = new DataApi(new HttpOnNextListener<Data>() { @Override public void onNext(Data data) { Log.i("MainActivity","onNext:"+data.toString()) ; Log.i("MainActivity","downurl:"+data.getDownurl()); } @Override public void onCacheNext(String string) { super.onCacheNext(string); Log.i("MainActivity","onCache:"+string); } @Override public void onError(Throwable e) { super.onError(e); } },this); HttpManager manager = HttpManager.getInstance(); //執行網絡請求 manager.doHttpDeal(api);