Google TODO-MVP-Loaders 简要分析
之前写的项目都是采用 MVC 模式(Model - View - Controller),虽然极力避免V层中出现逻辑处理,可整体还是凌乱一些。之前也看 鸿洋大神 的 浅谈 MVP in Android的文章,但是在项目中却没用实际应用过。刚好这几天不忙,就看了下 Google 官方的 TODO-MVP-Loaders ,并仿照其更改了自己的项目。
- MVP 模式
M: Model - 业务逻辑和实体模型;
V: View - 对应于Activity或Fragment,负责UI 绘制及用户交互;
P: Presenter - 负责 M 和 V 的交互。
看下Google 官方图示
从中可以看出,Sample 采用了观察者模式,Fragment 作为 View 层,而 Activity 负责 View 和 Presenter 的创建并将二者关联起来,Repository 可以看作为 M 层,Loader 我理解为是M 层的助手,在 Loader 中注册 Repository 并监听数据源变化。
- TODO-MVP-Loaders Sample 架构
Sample 中主要有四个模块:
Tasks - 任务列表;
Addedittask - 新建任务;
Taskdetail - 任务编辑;
Statistics - 统计。
所有模块 Presenter 的基类
public interface BasePresenter
{
void start();
}
View 的基类
public interface BaseView<T>
{
void setPresenter(T presenter);
}
这里主要 分析 Tasks 模块,其余模块思想都是类似的。
- Tasks
从上图的图示中,我们可以看到在 data 包下有数据源 source 及实体类 task,而 source 中有 local 和 remote 两个子包,从包名上就可以猜出一个是本地存储一个是网络存储,分别打开后我们可以看到,分别对应有TasksLocalDataSource 和TasksRemoteDataSource 类,并且都实现了 TasksDataSource 接口,而该接口中主要定义了对任务数据的所有操作,如
@Nullable
List<Task> getTasks();
@Nullable
Task getTask(@NonNull String taskId);
void saveTask(@NonNull Task task);
...
TasksRemoteDataSource 模拟网络数据操作,TasksLocalDataSource 采用SQLite数据库存储数据。由 MVP 模型定义我们可以知道,数据的逻辑处理是在 M 层中完成的,那么我们看下 M 都干了些什么活。
- TasksRepository 类
之前有说过,TasksRepository 作为 M