1. 程式人生 > >基於RxJava+Retrofit封裝的網路框架

基於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、RXjavaretrofit網路訪問使用

兩個月沒有寫微博了,無論如何,現在再次迴歸Android的打怪升級。 關於Rxjava的學習和介紹,有興趣的可以去雲盤中提取pdf資料,這裡不做詳解,地址和提取碼如下:連結:http://pan.baidu.com/s/1skDOjN3 密碼: ajv7。 要想

rxjava+retrofit+mvp封裝

簡介 工作期間有空我就學習rxjava2的使用,現在結合mvp的架構給大家封裝出一個開發框架,考慮到程式碼的重用性,資料介面的加密解密,我這裡做出了可以商用的,不單是學習。 框架程式碼下載 本框架所用到包 compile 'com.android.suppor