Android架构高级Android首页投稿(暂停使用,暂停投稿)

完全解析Android项目架构(2) - MVP

2016-10-20  本文已影响3398人  SpikeKing

欢迎Follow我的GitHub, 关注我的简书, 博客目录.

在Android中使用MVC架构, 无法完全分离View层与Model层中的UI逻辑与业务逻辑, 导致模块耦合, 无法全部覆盖测试. 因而引入进化版MVP(Model-View-Presenter)架构, 在Model层传输数据至View层时, 使用Presenter层封装逻辑. Google在Android框架指引中, 也采用MVP架构, 还添加若干细节, 源码参考Android架构的RxJava版本.

三个架构的分析均已完成, 参考MVC, MVP, MVVM.


MVP架构

MVP架构包含三大模块, 即Model, View, Presenter.

MVP

View层与Presenter层关系非常紧密, 相互引用, 并且一一对应. Presenter支持单元测试, View被抽象成若干显示接口, 供Presenter调用, View处理Android逻辑, Presenter处理UI逻辑. View和Presenter的接口信息, 放置在一个逻辑清晰的接口类(合同)中.

Model层

Model负责获取或存储远程或本地的数据. 例如, 在处理数据时, Model先检索本地数据, 为空则请求网络数据, 并同步本地, 再显示.

在构造器中, 添加本地与远程数据源的接口类, 数据源内分离逻辑与实现.

public static TasksRepository getInstance(TasksDataSource tasksRemoteDataSource,
                                          TasksDataSource tasksLocalDataSource) {
    if (INSTANCE == null) {
        INSTANCE = new TasksRepository(tasksRemoteDataSource, tasksLocalDataSource);
    }
    return INSTANCE;
}

View层

View与Presenter配合使用, 负责展示数据, 通知Presenter响应用户事件. Activity(或Fragment)是View层. View与Presenter相互对应. View继承自含有设置Presenter的接口.

public interface BaseView<T> {
    void setPresenter(T presenter);
}
public interface TasksContract {
    interface View extends BaseView<Presenter> {
        // ...
    }
    // ...
}

View在onResume中注册Presenter, 在onPause中释放Presenter.

@Override
public void onResume() {
    super.onResume();
    mPresenter.subscribe();
}
@Override
public void onPause() {
    super.onPause();
    mPresenter.unsubscribe();
}

当用户执行动作时, View截获事件, 通过Presenter接口传递事件给Presenter处理. 完成后, Presenter通过View接口传递数据给View显示或反馈. 因此, View与Presenter紧密关联, 接口也相互对应.

View使用Espresso进行UI测试.

Presenter层

Presenter与View一起创建, 并绑定View与Model的引用. 通过View接口, 在构造器中, 创建View与Presenter的相互引用.

public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
    mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
    mTasksView = checkNotNull(tasksView, "tasksView cannot be null!"); // 引用View
    mSubscriptions = new CompositeSubscription();
    mTasksView.setPresenter(this); // 在View中设置Presenter的引用
}

Presenter继承BasePresenter, 提供绑定与释放的方法. 确保在页面关闭时, 终止线程中的网络请求.

public interface BasePresenter {
    void subscribe();
    void unsubscribe();
}
public interface TasksContract {
    interface Presenter extends BasePresenter {
        // ...
    }
    // ...
}

当用户执行动作时, Presenter请求Model, 获取数据, 根据UI逻辑, 在View中显示. Presenter方法覆盖全部事件处理逻辑, 与View事件相互对应.

优缺点

MVP架构更好地分离View与Model之间的职责, 解除UI逻辑之间的耦合.

对于小型项目而言, 与设计模式类似, 会导致过度设计, 增加代码量. 当处理复杂页面时, Presenter层会包含大量UI逻辑与业务逻辑, 非常冗余, 并违反单一职责原理.


MVP架构的核心在于Presenter层. Presenter打破Model与View之间的耦合, 创建展示数据的通道, 隔离业务逻辑, 支持单元测试. 还有另一个架构, MVP的进化版MVVM.

OK, that's all! Enjoy it!

上一篇 下一篇

猜你喜欢

热点阅读