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

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