您的位置:首页 > 其它

安卓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的话,会让代码比较臃肿。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: