1、Github地址:https://github.com/googlesamples/android-architecture
里面有几个项目,这里下载的 todo-mvp 是比较基础的项目。
2、项目结构
这里先不管它们都是干嘛的,通过观察发现包下都包含这几类:
xxxActivity,
xxxFragment,
xxxContract,
xxxPresenter。
所以这个项目应该是按照不同界面来组织的。
其中xxxActivity,xxxFragment就是MVP中的V,xxxPresenter就是MVP中的P了。xxxContract是什么呢?以addedittask包下的AddEditTaskContract.java为例看下代码
public interface AddEditTaskContract {
interface View extends BaseView<Presenter> {
void showEmptyTaskError();
void showTasksList();
...
}
interface Presenter extends BasePresenter {
void createTask(String title, String description);
void updateTask( String title, String description);
...
}
}
是一个接口,里面又定义了两个接口,并分别继承了BaseView类和BasePersenter类
BaseView类
public interface BaseView<T> {
void setPresenter(T presenter);
}
BasePersenter类
public interface BasePresenter {
void start();
}
那么View和Persenter又被谁实现了呢?
Persenter毫无疑问是被XXXPersenter实现了,View是不是XXXActivity实现了呢?不是的,BaseView被XXXFragment实现了,而XXXActivity是负责创建XXXFragment和XXXPersenter,并将它们联系起来的。
最后是MVP的M了,它在项目的data包下
其中Task.java是存放数据的实体类,
TasksDataSource是个接口,里面有定义了两个接口,用来和Personter联系。
TasksDataSource
public interface TasksDataSource {
interface LoadTasksCallback {
void onTasksLoaded(List<Task> tasks);
void onDataNotAvailable();
}
interface GetTaskCallback {
void onTaskLoaded(Task task);
void onDataNotAvailable();
}
void getTasks(@NonNull LoadTasksCallback callback);
void getTask(@NonNull String taskId, @NonNull GetTaskCallback callback);
...
}
TasksRepository实现了TasksDataSource,负责处理 Task 数据。
public class TasksRepository implements TasksDataSource {
...
}
小结
这个项目的结构就差不多完了,流程分为这几步
1.Activity 将分别实现了 Persenter 和 View 的 XXXPersonter 和 XXXFragment 联系起来。
2.Persenter 通过 TasksDataSource 内的接口和 TasksRepository 联系起来。
3.XXXFragment触发点击事件,调用XXXPersenter 方法,XXXPersenter处理业务逻辑(例如效果图第二步,要判断Title或内容是否为空),XXXPersonter再通过 TasksReoisitory 将数据存入 Task中。
4.TasksReoisitory 通过回调再将 Task 数据 返回给 XXXPersenter,XXXPersenter 再专递给 XXXFragment 完成数据展示