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.
发表回复