0
点赞
收藏
分享

微信扫一扫

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

yongxinz 2022-02-16 阅读 14


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"]

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

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();
}
...
}

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

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();
}
...
}

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

4)创建一个接口

public interface ApiService {
...
}

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

注:ApiService的方法必须是​​Observable<BaseResponseEntity<T>>​​类型

5) 用Retrofit创建接口实例ApiService

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

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

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();
}
});
}
...
}

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

附:


  • 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.​​


举报

相关推荐

0 条评论