1.前言
在我們的App中,肯定需要通過網絡請求從後臺服務器獲取一些數據,這時就需要用到網絡請求框架,當下最流行的網絡框架應當就是 Retrofit 網絡框架了,我在實際項目中也都是使用 Retrofit,是採用 Retrofit + Callback的形式。我還以爲大家都是這麼用,直到有人問我,你知道RxJava嗎?原來很多人是採用Retrofit + RxJava2的形式。
所以今天就來嘗試一下 Retrofit + RxJava2 的形式。
2.實例
舉一個具體的例子,分別用 Retrofit + Callback 與 Retrofit + RxJava2 的形式來實現。
如:實現 Wanandroid_Learning 的主頁 Banner(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
這也是我一直在使用的方法。具體代碼如下:
- 首先是爲 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;
}
}
- 然後新建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'
- 包裝我們的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;
}
}
- 定義 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最友好的文章