安卓MVP模式
2017-11-12 09:15
267 查看
一、MVP概念
M : Model(负责存储、检索、操纵数据)V : View(负责绘制UI元素,与用户进行交互)
P : Presenter (是连接Model 和 View 的桥梁)
二、MVP的作用
将视图逻辑和业务逻辑分离开来,降低耦合度Activity只处理生命周期的任务
提高代码的阅读性
Presenter被抽象成接口,有多种具体的实现方式
业务逻辑在Presenter中,避免Activity造成内存泄露
三、MVP的核心思想
将Activity中的视图逻辑抽象成View接口,将业务逻辑抽象成Presenter接口四、MVP的使用
根据谷歌官方的mvp写法,以下将用一个用户登录的demo来讲解。github地址:https://github.com/jwllls/MVPDemo.git
步骤如下:
创建BaseView,BasePresenter
创建LoginContract(创建View 和 presenter,在其中声明方法 )
创建LoginPresenter(继承Contract 中的 Presenter,具体实现其中的方法)
创建LoginModel(具体实现数据逻辑,如请求网络数据,数据库中的数据等)
五、Demo代码说明
项目架构BaseView
public interface BaseView<T> { void setPresenter(T presenter); //该方法用于绑定View }
BasePresenter
public interface BasePresenter { void onStart(); //用来进行初始化工作 }
LoginContract
public class LoginContract { public interface View extends BaseView<Presenter> { //这里可以定义与 View 相关的方法 void showLoading(); // 显示加载 void dismissLoading(); // 隐藏加载 void toastSucMsg(); // 提示登录成功消息 void toastFailMsg();// 提示登录失败 } public interface Presenter extends BasePresenter { // 这里可以定义逻辑相关的方法,如请求网络数据或本地数据库的数据等。 void userLogin(String username, String password); // 定义一个登录方法, 模拟用户请求网络数据进行登录 } }
LoginModel
在Model中进行具体的数据操作,如请求网络数据或请求数据库的数据等等。
public class LoginModel { /** * 在这定义一个获取用户对象的方法 */ public User getUser() { //假设从服务器上获取到的对象是User,用户名和密码分别是admin和12345 User user = new User(); user.setUsername("admin"); user.setPassword("12345"); return user; } }
LoginPresenter
public class LoginPresenter implements LoginContract.Presenter { private LoginContract.View view; private UserModel model; < 9b9f span class="hljs-comment">//用于数据的处理,如网络请求、数据库请求等 private Activity activity; public LoginPresenter(LoginContract.View view, Activity activity) { this.view = view; this.activity = activity; view.setPresenter(this); //在构造方法中将 Presenter 和 View 绑定 model = new UserModel(); //创建UserModel对象 } @Override public void onStart() { // userLogin 可以在onStar( )进行初始化方法 } @Override public void userLogin(String username, String password) { User user = model.getUserModel(); //模拟获得网络请求返回的用户数据 view.showLoading(); //显示加载窗 if (user.getUsername().equals(username) && user.getPassword().equals(password)) { //加入账号密码正确则登录成功 new Handler().postDelayed(new Runnable() { //延迟2秒后执行 @Override public void run() { view.toastSucMsg(); //登录成功提示消息 view.dismissLoading(); //关闭加载窗 activity.startActivity(new Intent(activity, MainActivity.class)); //跳转到主界面 } }, 2000); } else { new Handler().postDelayed(new Runnable() { //延迟1秒后执行 @Override public void run() { view.toastFailMsg(); //登录失败提示消息 view.dismissLoading(); //关闭加载窗 } }, 1000); } } }
六、总结
以上代码简单地实现了一个用户登陆的mvp模式,这种模式能够将我们的代码充分解耦,能够很好地对代码进行维护和扩展。但是有些时候我们的需求是一些比较简单的业务逻辑和界面,这时候也可以结合mvc的方式来加快我们的开发速度,因为如果每个界面都要创建Presenter、View的话,会让代码比较臃肿。相关文章推荐
- 安卓MVP开发模式---初识
- 安卓MVP架构模式
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓中MVP模式和RxAndroid的具体实现例子
- 安卓开发中MVP模式的应用(附实例)
- 浅谈安卓中的MVP模式
- 浅谈安卓中的MVP模式
- 安卓之MVP模式
- 安卓中MVP模式和RxAndroid的具体实现例子
- MVP模式在安卓中的使用
- 安卓MVP设计模式
- MVP安卓开发模式
- MVP模式—— 安卓中的Model-View-Presenter模式介绍
- Android基础——框架模式MVP在安卓中的实践
- 安卓设计模式学习之_MVP
- 框架模式MVP在安卓中的实践
- 安卓开发框架(MVP+主流框架+基类+工具类)--- MVP模式
- 安卓中的MVP模式
- 安卓项目快速开发框架, MVP + Retrofit + RxJava,Activity 和 Fragment 结合 MVP 模式的完整封装,大大减少代码量