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最友好的文章