理解Android-architecture (一) todo
由来
由于最近一直对框架进行研究,在github 上发现Google 的官方框架Android-architecture这相当于Google官方为开发者们提供的Android app框架 设计指南
该项目展示了不同的工具和各种模式的框架,我们来逐一进行分析这是我们共同进步的过程
今天我们的分析todo-mvp
项目
QQ20190730-174645@2x.pngandroid-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 层负责页面的逻辑
上图为官方给出的图片,很好的分析了项目的结构
代码分析
在mvp模式中每个模块都是mvp结构我们通过首页模块进行分析其他模块是相同的
TaskContract 类
public interface TasksContract {
interface View extends BaseView<Presenter> {
void setLoadingIndicator(boolean active);
void showTasks(List<Task> 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<T> {
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 这个项目中其他结构,并且比较优缺点