• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

android 搞代码 4年前 (2022-03-01) 22次浏览 已收录 0个评论

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.

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:智汀云盘开发指南android端网络架构

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址