基於RxJava+Retrofit封裝的網路框架
1.依賴庫引入
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
2.基類設計
/**
* 建立一箇中間類用於建立M層和V層之間的連線,其實就是統一一個呼叫的入口,方便維護擴充套件
*/
public class Present<T extends BaseResult>{
protected BaseObserver mObserver;
public Present(BaseObserver observer) {
mObserver = observer;
//可根據mObserver的擴充套件屬性進行相應的初始化管理
}
public void execute(Observable<T> observable) {
if (mObserver.isLoading()) return;
observable
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//RxJava中map操作符也可以實現BaseObserver中對於介面規範中基礎資料的處理,自行選擇
/**.map(new Function<BaseResult<T>, T>() {
@Override
public T apply(BaseResult<T> base){
return base.getResult();
}
})**/
.subscribe(mObserver);
}
public static void execute(Observable observable, BaseObserver observer) {
observable
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
/**
* 基礎的觀察者,類似傳統BaseCallBack,處理介面規範的基層響應,該類應保持最基本的功能
* 繼承該類可擴充套件為與View層互動重新整理頁面,上傳,列表重新整理之類的Observer(ViewObserver)
*/
public abstract class BaseObserver<T extends BaseResult> implements Observer<T> {
public enum Status {
SUCCESS, NOT_DATA, FAILURE, NOT_LOGIN,
}
protected Disposable mDisposable;
protected boolean isLoading;
@Override
public void onSubscribe(@NonNull Disposable d) {//類似onBefore(),可初始化菊花圈之類...
Logger.i("onBefore");
mDisposable = d;
}
@Override
public void onNext(@NonNull T t) { //基礎響應的處理,可根據後端業務調整,不與View耦合
if(t==null){
onError(new Throwable("系統異常"));
return;
}
if(t.getCode()==0){
onResponse(t,SUCCESS);
}else if(t.getCode()==999){
onResponse(t,NOT_LOGIN);
}else{
onResponse(t,FAILURE);
}
}
protected abstract void onResponse(@NonNull T t, Status status);
@Override
public void onError(@NonNull Throwable e) {
isLoading = false;
}
@Override
public void onComplete() {
isLoading = false;
}
public boolean isLoading() {
return isLoading;
}
}
/**
* 基於與View層互動的Observer,將頁面切換的操作統一封裝在IViewSwitchImp類中
* IViewSwitchImp程式碼可自行封裝實現,此處只給出IViewSwitch 介面定義
*/
public abstract class ViewObserver<T> extends BaseObserver<BaseResult<T>> {
protected IViewSwitch mIView;
public ViewObserver(ViewGroup container) {
mIView = new IViewSwitchImp(contentView);
}
public ViewObserver(IViewSwitch view) {
mIView= view;
}
@Override
public void onSubscribe(@NonNull Disposable d) {
mIView.showLoading();
}
@Override
protected void onResponse(BaseResult<T> result, Status status) {
switch (status) {
case SUCCESS:
mIView.showContent();
onSuccess(result.getResult());
break;
case NOT_DATA:
mIView.showEmpty();
break;
case NOT_LOGIN:
mIView.showLogin(t.getMessage());
break;
case FAILURE:
mIView.showError(result.getMessage());
break;
}
}
public abstract void onSuccess(T t);
@Override
public void onError(@NonNull Throwable e) {
Logger.d(e.getMessage());
if (hasLoadDataSuccess) {
Toaster.show(e.getMessage());
} else {
mSwitchViewHelper.showFailure(e);
}
}
}
public interface IViewSwitch{
void showContent();
void showEmpty();
void showLoading();
void showError(String msg);
}
3.Retrofit的封裝
public class RetrofitFactory {
private static final java.lang.Object Object = new Object();
/**
* 快取機制
* 在響應請求之後在 data/data/<包名>/cache 下建立一個response 資料夾,保持快取資料。
* 這樣我們就可以在請求的時候,如果判斷到沒有網路,自動讀取快取的資料。
* 同樣這也可以實現,在我們沒有網路的情況下,重新開啟App可以瀏覽的之前顯示過的內容。
* 也就是:判斷網路,有網路,則從網路獲取,並儲存到快取中,無網路,則從快取中獲取。
* https://werb.github.io/2016/07/29/%E4%BD%BF%E7%94%A8Retrofit2+OkHttp3%E5%AE%9E%E7%8E%B0%E7%BC%93%E5%AD%98%E5%A4%84%E7%90%86/
*/
private static final Interceptor cacheControlInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!NetWorkUtil.isNetworkConnected(MyApplication.AppContext)) {
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
Response originalResponse = chain.proceed(request);
if (NetWorkUtil.isNetworkConnected(MyApplication.AppContext)) {
// 有網路時 設定快取為預設值
String cacheControl = request.cacheControl().toString();
return originalResponse.newBuilder()
.header("Cache-Control", cacheControl)
.removeHeader("Pragma")
.build();
} else {
// 無網路時 設定超時為1周
int maxStale = 60 * 60 * 24 * 7;
return originalResponse.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.removeHeader("Pragma")
.build();
}
}
};
private volatile static Retrofit retrofit;
@NonNull
public static Retrofit getRetrofit() {
synchronized (Object) {
if (retrofit == null) {
// 指定快取路徑,快取大小 50Mb
Cache cache = new Cache(new File(MyApplication.AppContext.getCacheDir(), "HttpCache"),
1024 * 1024 * 50);
// // Cookie 持久化
// ClearableCookieJar cookieJar =
// new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(InitApp.AppContext));
OkHttpClient.Builder builder = new OkHttpClient.Builder()
// .cookieJar(cookieJar)
.cache(cache)
.addInterceptor(cacheControlInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.retryOnConnectionFailure(true);
// Log 攔截器
if (BuildConfig.DEBUG) {
builder = HttpBuilderWrapper.initInterceptor(builder);
}
retrofit = new Retrofit.Builder()
.baseUrl(ApiConstant.HOST)
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
return retrofit;
}
}
}
public interface IHomeApi {
@FormUrlEncoded
@POST("/goods/guessyoulikes/v2")
Observable<BaseResult<HomeBean>> getContentList( @Field("userId")int userId);
}
4.呼叫
Observable<BaseResult<HomeBean>> observable = RetrofitFactory.getRetrofit().create(IHomeApi.class).getContentList(9527);
Present present = new Present(new ViewObserver<HomeBean>(new IViewSwitch()){
@Override
public void onSuccess(HomeBean bean){
}
});
present.excute(observable);
Emmm… 寫完發現並沒有什麼卵用,用Rxjava自帶的鏈式呼叫似乎更簡潔,這樣做的好處在於,將網路的異常響應統一封裝在一個可擴充套件的BaseObserver中並通過IViewSwitch展現給使用者,僅此而已,做個記錄
相關推薦
基於RxJava+Retrofit封裝的網路框架
1.依賴庫引入 implementation 'io.reactivex.rxjava2:rxjava:2.1.7' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' implementation
RxJava練武場之——基於RxJava Retrofit網路框架的搭建
RxJava練武場是一個rxjava在專案中應用的小系列,包括: RxJava練武場之——基於Observable網路框架的搭建 RxJava練武場之——Observable網路框架的解耦和複用 RxJava練武場之——Token前置請求 Observable網路
基於retrofit的網路框架的終極封裝(一):第一層(引數組裝層)的API設計
什麼是分層 app的架構,不管是MVC,MVP,MVVM,架構演變中,貫穿始終的概念都是分層和解耦.那麼這個分層和解耦怎麼體現出來? 簡單地說就是,我這一層接收上一層的輸入,上一層的你別管我怎麼處理,我最終會給你一個輸出/返回值,你完全不用理會我是
基於retrofit的網路框架的終極封裝(二)-與retrofit的對接與解耦,以及遇到的坑
在上一篇基於retrofit的網路框架的終極封裝(一)中介紹了頂層api的設計.這裡再沿著程式碼走向往裡說. 由於這裡講的是retrofit的封裝性使用,所以一些retrofit基礎性的使用和配置這裡就不講了. 引數怎麼傳遞到retrofit
基於retrofit的網路框架的終極封裝
什麼是分層 app的架構,不管是MVC,MVP,MVVM,架構演變中,貫穿始終的概念都是分層和解耦.那麼這個分層和解耦怎麼體現出來? 簡單地說就是,我這一層接收上一層的輸入,上一層的你別管我怎麼處理,我最終會給你一個輸出/返回值,你完全不用理會我是怎麼處理的,只要有輸入,就會有輸出,而且一般是通過一個簡
封住Rxjava+Retrofit 的網路請求
public class HttpUtils { private BaseService baseService; private Observable<ResponseBody> observable; public HttpUtil
Retrofit+okhttp網路框架介紹
網路框架選擇過程 目前Github上使用比較多的Android Http庫依次是Retrofit,okhttp,android-async-http,okhttp-utils,async-http-client,等等; 中間經過一系列的分析,根據start,
Rxjava+Retrofit+Gson組合框架的使用(一)
Retrofit 1.Retrofit的簡單示例 首先介紹Retrofit,這個是square公司的產品,它說白了就是對okhttp的封裝,它可以將HTTP API通過註解式程式設計來轉換為JAVA的介面,比如: public interface GitHubServi
「2020 新手必備 」極速入門 Retrofit + OkHttp 網路框架到實戰,這一篇就夠了!
老生常談 什麼是 Retrofit ? Retrofit 早已不是什麼新技術了,想必看到這篇部落格的大家都早已熟知,這裡就不囉嗦了,簡單介紹下: Retrofit 是一個針對 Java 和 Android 的設計的 REST 客戶機。它通過基於 REST 的 web 服務檢索和上傳 JSON (或其他結
如何封裝自己的網路框架 -進階封裝 (RxJava+okHttp+Retrofit)
一、進階封裝 ①網路框架的使用 mService.getAppVersion() //通過service 呼叫方法 .subscribeOn(Schedulers.io()) //指
RxJava+Retrofit+OkHttp深入淺出-終極封裝二(網路請求)
CSDN部落格釋出了一系列的RxJava+Retrofit+OkHttp深入淺出-終極封裝 之前發出後收到很多朋友的關注,原本只是自己學習後的一些經驗總結,但是有同學運用到實戰當中,這讓我很惶恐,所有後續一直更新了很多次版本,有些地方難免有所變動導致之前的部落格有所出入,正好最近受到掘金邀請內測部落格,所以決
基於OkHttp Retrofit RxJava 多執行緒下載。請求、快取、自動更新.限制佇列數.封裝庫
XDownload介紹 本庫封裝基於Okhttp3,Retrofit2,RxJava2.0,Greendao3.2 ps : 當然當然,都封裝好了,你也可以無視 GitHub地址 如果你覺得好用,對你有幫助,請給個star 介面
Retrofit2+RxJava封裝的網路框架(上)
在2016年7月份,有幸封裝了Retrofit2+RxJava+Builder設計模式的網路框架。在今年去面試的過程中,被面試官提及Retrofit2和RxJava的知識,我竟有些答不出來,這令我非常難過。看來就算自己做過的東西也難免會忘的一乾二淨,這裡呢,我將重新封裝一下這
RxJava + Retrofit + OKHttp + RxLifecycle進一步封裝網路
一、說明 RxJava和Retrofit的基本用法這裡不再闡述,網路上有很多教程,這裡只寫進一步封裝的過程,回顧一下我學習網路封裝的知識。 二、封裝過程 1、先把介面的資料格式理清楚,一般返回的Json格式都是這樣: { "code"
Retrofit網路框架封裝
聽到 Retrofit 大傢伙應該都很熟悉吧 , 近期研究了一下 其實很簡單 , 本人對他進行了 一個 簡單的封裝 。 網路許可權不必多說了吧 <uses-permission android:name="android.permission.INTERNET"
從0開始搭建rxjava+retrofit+mvp+dagger2整合基礎框架(rxjava+retrofit網路層搭建)
古語有云,沒有規矩,就不成方圓。其實做什麼事都一樣,做什麼事都要有自己熟悉且大家都認同的一套規矩,這樣既能提高自己的做事效率,也方便他人的理解。在移動開發中,mvp是新興的一種軟體開發模式,是經過時間的考驗並且大家都認同的解耦框架。它不僅能讓我們的程式碼邏輯更加清晰,不同層間分工不同又相互協作,服務於我們的專
通過代理模式,對第三方網路請求框架進行封裝,實現任意切換網路框架
最近在網上學習了一篇課程,講的是通過代理模式對第三方框架進行封裝。 感覺講的很不錯,受益良多,特此記錄。 首先什麼是代理模式? 代理模式就是:為其他物件提供一種代理,以控制對這個物件的訪問。 舉個例子:沒空下去吃飯,找個同事幫忙買飯就是代理模式;平常租房子, 嫌麻
Rxjava+Retrofit 觀察者模式 請求網路資料簡單使用
首先引入依賴 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation
OKhttp、RXjava與retrofit的網路訪問使用
兩個月沒有寫微博了,無論如何,現在再次迴歸Android的打怪升級。 關於Rxjava的學習和介紹,有興趣的可以去雲盤中提取pdf資料,這裡不做詳解,地址和提取碼如下:連結:http://pan.baidu.com/s/1skDOjN3 密碼: ajv7。 要想
rxjava+retrofit+mvp封裝
簡介 工作期間有空我就學習rxjava2的使用,現在結合mvp的架構給大家封裝出一個開發框架,考慮到程式碼的重用性,資料介面的加密解密,我這裡做出了可以商用的,不單是學習。 框架程式碼下載 本框架所用到包 compile 'com.android.suppor