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<BaseResponseEntity<T>>类型

5) 用Retrofit创立接口实例ApiService

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

6) 配合RxJava应用并封装

public abstract class BasePresenter<M extends IModel, V extends IView> implements IPresenter<V> {    ...     /**     * 网络申请     *     * @param observable     * @param callback     * @param <T>     */    public <T> void executeObservable(Observable<BaseResponseEntity<T>> observable, RequestDataCallback<T> callback) {        observable.subscribeOn(Schedulers.io())                .unsubscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<BaseResponseEntity<T>>() {                    @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<T> 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.