关于android:智汀云盘开发指南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<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.

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理