智汀云盘-开发指南android端:网络架构

1. 网络架构

在讲网络框架之前,我们先来说说开发模式。智汀云盘使用的开发模式是MVP(Model-View-Presenter)模式:

  • Model提供数据
  • View负责显示
  • Controller/Presenter负责逻辑的处理

MVP是从MVC演变而来的,但它与MVC有着一个重大的区别:

  • 在MVP中View并不直接使用Model,它们是通过Presenter(MVC中的Controller)来进行通信的,所有的交互都发生再Presenter内容
  • 而MVC中View读取数据不是通过Controller而是直接从Model中读取。

MVP有以下三个优势:

  • View与Model完全隔离;
  • Presenter与View的具体实现技术无关;
  • 可以进行View的模拟测试。

接着我们继续来看网络请求框架,智汀云盘使用的网络请求框架是:Retrofit + RxJava + OkHttp。

  • Retrofit是Square公司基于OkHttp封装的Android网络请求框架;
  • OkHttp是一个网络请求库,也是Square开源的;
  • RxJava在GitHub上的描述是:a library for composing asynchronous and event-based programs by using observable sequences(使用可观察序列编写异步和基于事件的程序的库),这使得我们切换线程的操作变得更加简单。

Retrofit + RxJava + OkHttp是当下Android用Java语言开发最流行的网络请求方式。

下面是网络框架集成的步骤:

1) 导入相关的库

api rootProject.ext.dependencies["gson"]
api rootProject.ext.dependencies["okhttp"]
api rootProject.ext.dependencies["loggingInterceptor"]
api rootProject.ext.dependencies["retrofit"]
api rootProject.ext.dependencies["converterGson"]
api rootProject.ext.dependencies["rxjavaAdapter"]
api rootProject.ext.dependencies["rxandroid"]
api rootProject.ext.dependencies["rxjava"]

2) 创建Retrofit实例<

public class RetrofitManager {
    ...
     private RetrofitManager(String baserUrl) {
        retrofit = new Retrofit.Builder()
                .baseUrl(baserUrl)
                .client(getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create(GsonConverter.getGson()))
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .build();
    }
    ...
}

3) 添加OkHttp配置

public class RetrofitManager {
    ...
     private OkHttpClient getOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(getHttpLoginInterceptor())
                .connectTimeout(HttpConfig.connectTimeout, TimeUnit.SECONDS)
                .readTimeout(HttpConfig.readTimeOut, TimeUnit.SECONDS)
                .writeTimeout(HttpConfig.writeTimeOut, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true);
        return builder.build();
    }
    ...
}

4)创建一个接口

public interface ApiService {
    ...
}

注:ApiService的方法必须是Observable>类型

5) 用Retrofit创建接口实例ApiService

public class RetrofitManager {
    ...
    public  T create(Class service) {
        return retrofit.create(service);
    }
    ...
}

6) 配合RxJava使用并封装

public abstract class BasePresenter implements IPresenter {
    ...
     /**
     * 网络请求
     *
     * @param observable
     * @param callback
     * @param 
     */
    public  void executeObservable(Observable> observable, RequestDataCallback callback) {
        observable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        mModel.addDisposable(d);
                        if (mView != null && callback != null && callback.isLoading())
                            mView.showLoading();
                    }

                    @Override
                    public void onNext(@NonNull BaseResponseEntity response) {
                        if (callback != null) {
                            if (response.getStatus() == 0) { // 成功
                                callback.onSuccess(response.getData());
                            } else { // 失败
                                if (mView != null) {
                                    if (callback != null && callback.isLoading())
                                        mView.hideLoading();
                                    if (response.getStatus() != ErrorConstant.INVALID_AUTH) // 如果不是无效的授权才需要土司提示
                                        showError(response.getReason()); // 提示错误信息
                                    mView.showError(response.getStatus(), response.getReason()); // 提示错误信息
                                }
                                callback.onFailed(response.getStatus(), response.getReason());
                            }
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        e.printStackTrace();
                        String error = "";
                        if (e instanceof ConnectException || e instanceof UnknownHostException) {
                            error = "网络异常,请检查网络";
                        } else if (e instanceof TimeoutException || e instanceof SocketTimeoutException) {
                            error = "网络不畅,请稍后再试!";
                        } else if (e instanceof JsonSyntaxException) {
                            error = "数据解析异常";
                        } else {
                            error = "服务端错误";
                        }
                        if (mView != null) {
                            if (callback != null && callback.isLoading())
                                mView.hideLoading();
                            showError(error);
                        }
                    }

                    @Override
                    public void onComplete() {
                        if (mView != null && callback != null && callback.isLoading())
                            mView.hideLoading();
                    }
                });
    }
    ...
}

附:

  • Retrofit: GitHub - square/retrofit: A type-safe HTTP client for Android and the JVM
  • RxJava:GitHub - ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
  • OkHttp:GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

你可能感兴趣的:(android)