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.