理解Android-architecture (一) todo - mvp

由来

由于最近一直对框架进行研究,在github 上发现Google 的官方框架Android-architecture这相当于Google官方为开发者们提供的Android app框架 设计指南

该项目展示了不同的工具和各种模式的框架,我们来逐一进行分析这是我们共同进步的过程

今天我们的分析todo-mvp

项目


android-architecture一系列都实现了一个todo-list 的demo

项目结构

WechatIMG64560.png
  • addedittask 用于创建或编辑任务。
  • data 封装的数据源
  • statistics 用于进行任务统计
  • taskdetail 用于读取或删除任务
  • tasks 显示与任务相关的统计信息。
  • util 工具类
  • BasePresenter persenter用来连接view 和 model 的桥梁,用来处理逻辑分析
  • BaseView view的基类

思路分析

MVP模式是 Model View Presenter 其中view层和model层是没有关联的他们之间是通过presenter层来进行桥梁的构建 与MVC相比不会发生在Activity中即实现view 和controller 层造成代码的冗余不便于理解

在todo-mvp这个项目中每一个模块都是通过mvp来进行构建的这也是一个标准的mvp模式

  • Model 层是对数据的处理在这个项目中是data的封装
  • Presenter 层是负责view 和model之间的桥梁,还负责进行逻辑处理
  • View 层负责页面的逻辑

image

上图为官方给出的图片,很好的分析了项目的结构

代码分析

在mvp模式中每个模块都是mvp结构我们通过首页模块进行分析其他模块是相同的

TaskContract 类

public interface TasksContract {

    interface View extends BaseView {

        void setLoadingIndicator(boolean active);

        void showTasks(List tasks);

        void showAddTask();

        void showTaskDetailsUi(String taskId);

        void showTaskMarkedComplete();

        void showTaskMarkedActive();

        void showCompletedTasksCleared();

        void showLoadingTasksError();

        void showNoTasks();

        void showActiveFilterLabel();

        void showCompletedFilterLabel();

        void showAllFilterLabel();

        void showNoActiveTasks();

        void showNoCompletedTasks();

        void showSuccessfullySavedMessage();

        boolean isActive();

        void showFilteringPopUpMenu();
    }

    interface Presenter extends BasePresenter {

        void result(int requestCode, int resultCode);

        void loadTasks(boolean forceUpdate);

        void addNewTask();

        void openTaskDetails(@NonNull Task requestedTask);

        void completeTask(@NonNull Task completedTask);

        void activateTask(@NonNull Task activeTask);

        void clearCompletedTasks();

        void setFiltering(TasksFilterType requestType);

        TasksFilterType getFiltering();
    }
}

这个类相当于Presenter 和view 之间的协议 通过接口对view层和presenter层来进行解耦

BaseView代码

public interface BaseView {

    void setPresenter(T presenter);

}

setpresenter() 方法是将页面与presenter进行关联

在页面中代码是这样写的 详情见 TasksFragment

 @Override
    public void setPresenter(@NonNull TasksContract.Presenter presenter) {
        mPresenter = checkNotNull(presenter);
    }

在view层是通过setPresenter方法拿到的实例

BasePresenter

public interface BasePresenter {

    void start();

}

只有一个start 方法 这个方法是通过启动进行数据加载进行的调用

TasksPresenter


public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
        mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
        mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");

        mTasksView.setPresenter(this);
    }

在Taskpresenter 中我们通过构造方法就可以看出通过构造将view层和model层传入进来并且通过setPresenter()方法将Presenter的实例传入,让view层方便调用

总结

todo-mvp 是一个非常基础的MVP结构也是最简单的,经典的MVP构造,在这里就不进行老生常谈了我们接下来会继续分析 Android-architecture 这个项目中其他结构,并且比较优缺点

你可能感兴趣的:(理解Android-architecture (一) todo - mvp)