Android 網絡請求是選擇Retrofit + RxJava2 還是 Retrofit + Callback?

1.前言

在我們的App中,肯定需要通過網絡請求從後臺服務器獲取一些數據,這時就需要用到網絡請求框架,當下最流行的網絡框架應當就是 Retrofit 網絡框架了,我在實際項目中也都是使用 Retrofit,是採用 Retrofit + Callback的形式。我還以爲大家都是這麼用,直到有人問我,你知道RxJava嗎?原來很多人是採用Retrofit + RxJava2的形式。

所以今天就來嘗試一下 Retrofit + RxJava2 的形式。

2.實例

舉一個具體的例子,分別用 Retrofit + Callback 與 Retrofit + RxJava2 的形式來實現。
如:實現 Wanandroid_Learning 的主頁 Banner(Wanandroid_Learning傳送門),他是有四張圖片組成,具體如下所示:

Wanandroid_Learning主頁截圖

要想在項目中使用 Retrofit,我們需要在 build.gradle(app) 中定義引用 Retroft庫,如:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

2.1 Retrofit + Callback

這也是我一直在使用的方法。具體代碼如下:

  1. 首先是爲 Retrofit 新建一個包裝類,如下:
    ApiWrapper.java
public class ApiWrapper {
    private static Retrofit retrofit;
    private static final String BASE_URL = "https://www.wanandroid.com";

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {

            // customize retrofit network timeouts, default timeouts is ten seconds.
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(15, TimeUnit.SECONDS)
                    .build();

            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .build();
        }
        return retrofit;
    }
}
  1. 然後新建API接口文件,如下:
    ApiService.java
public interface ApiService {
    @GET("/banner/json")
    Call<ResponseBody> getHomeBannerList();
}

3.我採用的是MVVM的開發模式,所以我會在Repository文件中處理請求工作,如下:
HomeRepository.java

public void getHomeBannerList(final GetWebDataListener listener) {
    ApiService apiService = ApiWrapper.getRetrofitInstance().create(ApiService.class);
    //執行異步請求,自定義Callback回調接口
    apiService.getHomeBannerList().enqueue(new AbstractRetrofitCallback() {
        @Override
        public void getSuccessful(String responseBody) {
            Gson gson = new Gson();
            HomeBannerListBean homeBannerListBean = gson.fromJson(responseBody, HomeBannerListBean.class);
            listener.getDataSuccess(homeBannerListBean);
        }

        @Override
        public void getFailed(String failedMsg) {
            listener.getDataFailed(failedMsg);
        }
    });
}

具體完整的代碼見: Wanandroid_Learning

2.2 Retrofit + RxJava2

首先,要想在項目中使用 RxJava2, 我們需要先在 build.gradle(app) 中引用 RxJava2,如:

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
  1. 包裝我們的Retrofit,添加 addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 方法,如下:
    ApiWrapper.java
public class ApiWrapper {
    private static Retrofit retrofit;
    private static final String BASE_URL = "https://www.wanandroid.com";

    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {

            // customize retrofit network timeouts, default timeouts is ten seconds.
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(1, TimeUnit.MINUTES)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(15, TimeUnit.SECONDS)
                    .build();

            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
  1. 定義 API 接口,如下:
public interface ApiService {
    /**
     * Retrofit + RxJava2
     * @return io.reactivex.Observable
     */
    @GET("/banner/json")
    Observable<HomeBannerListBean> getRxJavaHomeBannerList();
}

3.我採用的是MVVM的開發模式,所以我會在Repository文件中處理請求工作,如下:
HomeRepository.java

public void getRxJava2HomeBannerList(final GetWebDataListener listener) {
    ApiService apiService = ApiWrapper.getRetrofitInstance().create(ApiService.class);
    apiService.getRxJavaHomeBannerList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<HomeBannerListBean>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.e(TAG, "onSubscribe: ");
                }

                @Override
                public void onNext(HomeBannerListBean homeBannerListBean) {
                    Log.e(TAG, "onNext: ");
                    listener.getDataSuccess(homeBannerListBean);
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: " + e.getMessage());
                }

                @Override
                public void onComplete() {
                    Log.e(TAG, "onComplete: ");
                }
            });
}

3.總結

正如我開頭所說,目前我在實際項目中都是使用 Retrofit + Callback,用的也很順手,關於 Retrofit + RxJava2我也只是嘗試了一下,更多的實踐還需在實際項目中使用。

不知你們在實際項目中,使用的是哪一種方式呢?歡迎討論。

關於 RxJava 推薦參考文檔:
關於 RxJava 最友好的文章—— RxJava 2.0 全新來襲
關於RxJava最友好的文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章