MVP之Android官方MVP架构学习—View层和Presenter层
2017-10-23 14:42
429 查看
一、 MVC和MVP
1. MVC
MVC的全称为Model-View-Controller,即模型-视图-控制器。Model:处理数据和业务逻辑等
View:显示界面,展示结果等
Controller:控制流程,处理交互
MVC各个模块通信方式如下:
MVC.jpg
2. MVP
MVP的全称为Model-View-Presenter,即模型-视图-协调器(主持者)Model:处理数据和业务逻辑等
View:显示界面,展示结果等
Presenter:协调Model和View模块工作,处理交互
MVP各个模块通信方式如下:
MVP.jpg
3. MVC和MVP区别
在MVC模式中,View和Model可以直接交互;在MVP模式中,View和Model模块不能直接交互,View通过Presenter与Model间接交互。在MVC中,Controller是基于行为的,可以被多个View共享,可以负责决定显示哪个View;在MVP中View和Presenter是一对一或这一对多的,并且Presenter和View是通过接口交互的。
二、 Google官方MVP示例
1. 项目说明
项目地址:https://github.com/googlesamples/android-architecture项目内容说明:
已完成的示例
todo-mvp/ - mvp基础架构示例
todo-mvp-loaders/ - 基于todo-mvp,获取数据部分使用了Loaders
todo-mvp-databinding/ - 基于todo-mvp,使用了Data Binding Library
进行中的示例
dev-todo-mvp-contentproviders/ - 基于todo-mvp-loaders,使用了Content Providers
dev-todo-mvp-clean/ - 基于todo-mvp,使用了Clean Architecture的概念.
dev-todo-mvp-dagger/ - 基于todo-mvp,使用了Dagger2进行依赖注入
2. todo-mvp基础架构项目分析
2.1 代码组织方式项目的app/src/main/java目录中代码的组织方式是按照功能模块组织的,每个功能为一个包,每个功能模块的内部分为xActivity、xFragment、xPresenter、xContract四个类文件,其作用如下:
xActivity主要负责创建View和Presenter实例,并将它们联系起来
xFragment实现View接口,作为MVP结构中的View
xPresenter实现Presenter接口,是MVP结构中的Presenter
xContract作为合同接口,统一管理View和Presenter的接口,便于查看和维护View和Presenter的功能
Model作为单独的模块存放与data目录下
项目的app/src/main/java目录中结构如下:
todo-mvp-java.jpg
2.2 MVP实现方式
以添加或编辑任务功能模块(addedittask)为例
2.2.1 View和Present基础接口
BaseView接口中有setPresenter方法,用于将Presenter实例传入View中,在Presenter的实现类的构造方法中调用。
public interface BaseView<T> { void setPresenter(T presenter); }
BasePresenter接口中有start方法,用于Presenter开始获取数据并调用View进行界面显示,在View的实现类Fragment中的onResume方法中调用。
public interface BasePresenter { void start(); }
2.2.2 AddEditTaskContract
AddEditTaskContract是一个合同接口,其中包含了View和Presenter接口,便于查看和维护View和Presenter的功能。
public interface AddEditTaskContract { interface View extends BaseView<Presenter> { void showEmptyTaskError(); void showTasksList(); void setTitle(String title); void setDescription(String description); boolean isActive(); } interface Presenter extends BasePresenter { void createTask(String title, String description); void updateTask( String title, String description); void populateTask(); } }
2.2.3 AddEditTaskActivity
AddEditTaskActivity中创建了View的实现类AddEditTaskFragment的实例和Presenter的实现类AddEditTaskPresenter的实例,并把它们联系起来。
public class AddEditTaskActivity extends AppCompatActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.addtask_act); ... // 创建AddEditTaskFragment实例 AddEditTaskFragment addEditTaskFragment = (AddEditTaskFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame); String taskId = null; if (addEditTaskFragment == null) { addEditTaskFragment = AddEditTaskFragment.newInstance(); if(getIntent().hasExtra(AddEditTaskFragment.ARGUMENT_EDIT_TASK_ID)) { taskId = getIntent().getStringExtra( AddEditTaskFragment.ARGUMENT_EDIT_TASK_ID); actionBar.setTitle(R.string.edit_task); Bundle bundle = new Bundle(); bundle.putString(AddEditTaskFragment.ARGUMENT_EDIT_TASK_ID, taskId); addEditTaskFragment.setArguments(bundle); } else { actionBar.setTitle(R.string.add_task); } ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), addEditTaskFragment, R.id.contentFrame); } // 创建Presenter实例,传入Model实例和AddEditTaskFragment实例,建立View和Presenter之间的联系 new AddEditTaskPresenter( taskId, Injection.provideTasksRepository(getApplicationContext()), addEditTaskFragment); } ... }
2.2.4 AddEditTaskFragment
AddEditTaskFragment实现了AddEditTaskContract接口中的View接口,其中有一个Presenter实例,在onResume方法中调用Presenter的start方法。
public class AddEditTaskFragment extends Fragment implements AddEditTaskContract.View { private AddEditTaskContract.Presenter mPresenter; public static AddEditTaskFragment newInstance() { return new AddEditTaskFragment(); } public AddEditTaskFragment() { // Required empty public constructor } @Override public void onResume() { super.onResume(); 8d03 // 调用start方法 mPresenter.start(); } // 重写setPresenter方法 @Override public void setPresenter(@NonNull AddEditTaskContract.Presenter presenter) { mPresenter = checkNotNull(presenter); } ... }
2.2.5 AddEditTaskPresenter
AddEditTaskPresenter实现了AddEditTaskContract接口中的Presenter接口,其中有一个View实例,在构造方法中调用View的setPresenter方法与View建立联系。
public class AddEditTaskPresenter implements AddEditTaskContract.Presenter, TasksDataSource.GetTaskCallback { // Model实例,完成数据获取 @NonNull private final TasksDataSource mTasksRepository; @NonNull private final AddEditTaskContract.View mAddTaskView; @Nullable private String mTaskId; public AddEditTaskPresenter(@Nullable String taskId, @NonNull TasksDataSource tasksRepository, @NonNull AddEditTaskContract.View addTaskView) { mTaskId = taskId; mTasksRepository = checkNotNull(tasksRepository); mAddTaskView = checkNotNull(addTaskView); mAddTaskView.setPresenter(this); } // 重写start方法,开始获取数据 @Override public void start() { if (mTaskId != null) { populateTask(); } } ... }
3. 总结
官方的实例项目有十分清晰的模块划分,复杂度也相对较低,易于学习,相对于普通的MVP增加了合同接口,便于模块功能的管理和扩展。
转载自:http://www.jianshu.com/p/83b28956bc6e
相关文章推荐
- Android官方架构项目之MVP + Clean 学习
- Android官方TODO-MVP项目分析(上)---View 层 Presenter 层以及 Contract 分析
- Android MVP 架构一 View与Presenter
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- Android单元测试<中>(Android官方MVP架构示例项目解析)
- Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- MVP架构-Android官方MVP项目和响应式MVP-RxJava项目架构分析对比解读
- Android官方MVP架构解读
- 转:Android官方MVP架构示例项目解析
- Android官方MVP架构示例项目解析
- ASP.NET MVP( Model View Presenter )微软官方介绍
- Android-----官方MVP架构----示例项目解析
- Android官方MVP架构解读
- google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))
- Android官方MVP架构示例项目解析
- Android官方MVP架构解读
- Android官方MVP架构--解读
- Android官方MVP架构解读