带你封装MVP架构(下)|青训营笔记(一)

简介: 在 Base 类中,我们需要做的就是把每个 Activity 或者 Fragment 等这些组件,或者对应的 MVP 层会用到的基本操作以及联系都编写好。

前置知识

MVPMVP架构模式详解 - 简书 (jianshu.com)

RetrofitRetrofit使用详解-注解介绍

RxJavaCarson带你学Android:这是一篇清晰易懂的Rxjava入门教程 - 简书 (jianshu.com)

ViewBinding:kotlin-android-extensions插件也被废弃了?

提取Base基类

Base 类中,我们需要做的就是把每个 Activity 或者 Fragment 等这些组件,或者对应的 MVP 层会用到的基本操作以及联系都编写好。后续模块编写的时候直接继承这些 Base 类即可,如此可以免去过多不必要的操作,让开发人员可以把精力更多的花在有意义的地方。

BaseView

BaseView  此接口是MVP模式中,用于各模块链接的关键。我们可以在此处定义好所有 Activity 和 Fragment 可能都会使用到的加载动画的调用方法

public interface BaseView {
    /**
     * 显示加载中
     */
    void showLoading();
    /**
     * 操作成功隐藏dialog和显示成功
     */
    void SuccessHideLoading();
    /**
     * 操作失败隐藏dialog和显示失败
     */
    void FailedHideLoading();
    /**
     * 错误
     *
     * @param bean 错误信息
     */
    @SuppressWarnings("rawtypes")
    void onErrorCode(BaseBean bean);
}
复制代码

BaseBean/BaseEvent

BaseBean/BaseEvent 这两个的用处一个是抽象出收到的 json 报文的基本字段做 Base类,供错误处理机制来自行判断处理;而 BaseEvent 则是抽象出 EventBus 的消息事件,对每个发送的消息都赋予唯一的 eventCode  ,用来做消息事件识别。

public class BaseBean<T> implements Serializable {
    //From 测试图片
    public int code;
    public String msg;
    public String message;
    public T data;
    public BaseBean(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}
复制代码
public class BaseEvent<T> {
    private int eventCode;
    private T data;
    public BaseEvent(int eventCode, T data) {
        this.eventCode = eventCode;
        this.data = data;
    }
    public int getEventCode() {
        return eventCode;
    }
    public void setEventCode(int eventCode) {
        this.eventCode = eventCode;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}
复制代码

BaseException

此处自定义了一个异常的基类,供外部构建类或者是获取其中的成员变量。同时它继承自 IOException ,可以作为异常被统一处理,所以也可以用来特定的处理某种异常

public class BaseException extends IOException {
    private String errorMsg;
    private int errorCode;
    public String getErrorMsg() {
        return errorMsg;
    }
    public int getErrorCode() {
        return errorCode;
    }
    public BaseException(String message) {
        this.errorMsg = message;
    }
    public BaseException(String errorMsg, Throwable cause) {
        super(errorMsg, cause);
        this.errorMsg = errorMsg;
    }
    public BaseException(int errorCode, String message) {
        this.errorMsg = message;
        this.errorCode = errorCode;
    }
}
复制代码

BaseObserver

该类继承自 RxjavaDisposableObserver ,我们创建该类,可以预重写 onStart()onNext(T o)onError(Throwable e) 等方法,预处理错误流;让我们再次继承的时候,只需要简洁的重写 onSuccess() 以及 onError() 即可。这个类的封装,让我们的网络请求变得十分优雅。

public abstract class BaseObserver<T> extends DisposableObserver<T> {
    protected BaseView view;
    private boolean isShowDialog;
    protected BaseObserver(BaseView view) {
        this.view = view;
    }
    /**
     * 带进度条的初始化方法
     *
     * @param view         view
     * @param isShowDialog 是否显示进度条
     */
    protected BaseObserver(BaseView view, boolean isShowDialog) {
        this.view = view;
        this.isShowDialog = isShowDialog;
    }
    @Override
    protected void onStart() {
        if (view != null && isShowDialog) {
            view.showLoading();
        }
    }
    @Override
    public void onNext(T o) {
        onSuccess(o);
    }
    @Override
    public void onError(Throwable e) {
        if (view != null && isShowDialog) {
            view.FailedHideLoading();
        }
        BaseException be;
        if (e != null) {
            //自定义异常
            if (e instanceof BaseException) {
                be = (BaseException) e;
                //回调到view层 处理 或者根据项目情况处理
                if (view != null) {
                    view.onErrorCode(new BaseBean<>(be.getErrorCode(), be.getErrorMsg()));
                } else {
                    onError(be.getErrorMsg());
                }
                //系统异常
            } else {
                if (e instanceof HttpException) {
                    //HTTP错误
                    be = new BaseException(MyUtil.getString(R.string.BAD_NETWORK_MSG), e);
                } else if (e instanceof ConnectException || e instanceof UnknownHostException) {
                    //连接错误
                    be = new BaseException(MyUtil.getString(R.string.CONNECT_ERROR_MSG), e);
                } else if (e instanceof InterruptedIOException) {
                    //连接超时
                    be = new BaseException(MyUtil.getString(R.string.CONNECT_TIMEOUT_MSG), e);
                } else if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) {
                    //解析错误
                    be = new BaseException(MyUtil.getString(R.string.PARSE_ERROR_MSG), e);
                } else {
                    be = new BaseException(MyUtil.getString(R.string.OTHER_MSG), e);
                }
            }
        } else {
            be = new BaseException(MyUtil.getString(R.string.OTHER_MSG));
        }
        onError(be.getErrorMsg());
    }
    @Override
    public void onComplete() {
        if (view != null && isShowDialog) {
            view.SuccessHideLoading();
        }
    }
    public abstract void onSuccess(T o);
    public abstract void onError(String msg);
}
复制代码

BasePresenter

由于我们的 Presenter 层主要作用是连接 View 层和 Model 层,对他们解耦。而当我们的 Model 层的数据处理比较少的时候,例如只有网络请求这种情况,我们就可以直接调用 addDisposable 方法发起请求,而 BaseObserver 也就是被封装好的 Model 层。这种做法是符合 迪米特原则 的方法。

public class BasePresenter<V extends BaseView> {
    private CompositeDisposable compositeDisposable;
    public V baseView;
    /**
     * 这个后面可以直接用   Example:apiServer.login(username, password);
     */
    protected API.SZApi apiServer = RetrofitService.getInstance().getApiService();
    public BasePresenter(V baseView) {
        this.baseView = baseView;
    }
    /**
     * 解除绑定
     */
    public void detachView() {
        baseView = null;
        removeDisposable();
    }
    /**
     * 返回 view
     */
    public V getBaseView() {
        return baseView;
    }
    @SuppressWarnings("all")
    public void addDisposable(Observable<?> observable, BaseObserver observer) {
        if (compositeDisposable == null) {
            compositeDisposable = new CompositeDisposable();
        }
        compositeDisposable
                .add(observable.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeWith(observer));
    }
    private void removeDisposable() {
        if (compositeDisposable != null) {
            compositeDisposable.dispose();
        }
    }
}
复制代码


相关文章
|
运维 架构师
架构师“三部曲”——阿里云 MVP 沈剑
沈剑,公众号“架构师之路”的作者,曾任百度高级工程师和58同城高级架构师、技术委员会主席、技术学院优秀讲师,现为到家集团技术委员会主席和技术VP,同时也是快狗打车(原58速运)的CTO。本文是沈剑老师在阿里云的直播中分享的一些自己关于架构师的看法和成为架构师的心路历程的第二部分。
3458 0
架构师“三部曲”——阿里云 MVP 沈剑
|
6月前
|
设计模式 前端开发 Android开发
Android应用开发中的MVP架构模式解析
【5月更文挑战第25天】本文深入探讨了在Android应用开发中广泛采用的一种设计模式——Model-View-Presenter (MVP)。文章首先概述了MVP架构的基本概念和组件,接着分析了它与传统MVC模式的区别,并详细阐述了如何在实际开发中实现MVP架构。最后,通过一个具体案例,展示了MVP架构如何提高代码的可维护性和可测试性,以及它给开发者带来的其他潜在好处。
|
6月前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
|
6月前
|
前端开发 测试技术 数据处理
安卓开发中的MVP架构模式深度解析
【4月更文挑战第30天】在移动应用开发领域,模型-视图-呈现器(Model-View-Presenter, MVP)是一种广泛采用的架构模式。它旨在通过解耦组件间的直接交互来提高代码的可维护性和可测试性。本文将深入探讨MVP在安卓开发中的应用,揭示其如何促进代码的模块化,提升用户界面的响应性,并简化单元测试过程。我们将从理论概念出发,逐步过渡到实践案例,为读者提供一套行之有效的MVP实施策略。
|
设计模式 Cloud Native 架构师
分享一份美团T9大牛总结的神仙微服务架构设计模式PDF
微服务作为一项在云中部署应用和服务的新技术已成为当下最新的热门话题。 企业和服务提供商正在寻找更好的方法将应用程序部署在云环境中,微服务被认为是未来的方向。通过将应用和服务分解成更小的、松散耦合的组件,它们可以更加容易升级和扩展,理论上是这样。
|
Dubbo Java 应用服务中间件
使用Kitex框架构建自己的服务|青训营笔记
这篇文章主要跟随官方文档给出自己使用Kitex构建一个服务的过程,而后续Kitex更多的特性则需要大家深入学习、实践、总结。
677 0
使用Kitex框架构建自己的服务|青训营笔记
|
Android开发 索引
EventBus封装到项目架构|青训营笔记
封装该库到自己的项目的目的有两个 便捷绑定和解绑 EventBus 便捷通过 EventBus 发送消息和处理消息 代码美观
EventBus封装到项目架构|青训营笔记
|
缓存 SpringCloudAlibaba 算法
阿里新一代微服务,内部大佬手抄的笔记+脑图不容错过,全是精华
今天来聊聊Spring Cloud Alibaba,它是Spring Cloud规范的一套实现,为分布式应用程序开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。Spring Cloud Alibaba中的组件,基本都是由阿里内部中间件转化而来,经历过多次双十一的考验,这也就意味着,Spring Cloud Alibaba有着充足的场景,验证了它对于高并发的抗压能力。
阿里新一代微服务,内部大佬手抄的笔记+脑图不容错过,全是精华
|
前端开发 Android开发
带你封装MVP架构(上)|青训营笔记(一)
我们做一个 MVP 架构的封装,主要其相对于MVC更加解耦,能让开发人员在编写代码的时候更加高效和舒服。
带你封装MVP架构(下)|青训营笔记(二)
在 Base 类中,我们需要做的就是把每个 Activity 或者 Fragment 等这些组件,或者对应的 MVP 层会用到的基本操作以及联系都编写好。