您的位置:首页 > 移动开发 > Android开发

31.Android MVP模式

2015-11-03 18:19 453 查看

31.Android MVP模式

Android MVP模式
Android MVP介绍

Android MVP UML图

Android MVP实现

Android MVP项目结构

Android MVP作用

代码下载

Android MVP介绍

先说说MVC吧,MVC(Model-View-Controller)是Java中一种非常常用的开发模式。但是在Android中,View的话可以很容易想到Activity和Fragment,但是Controller的话,我们怎么想都还是Activity,因为无论是Activity还是Fragment跳转的话,都要执行
startActivity
所以无论怎么想,Controller都是由Activity在兼职。

Activity身兼View和Controller的职位,导致代码过度耦合,上千行也是常有的。

MVP(Model-View-Presenter)MVP的主要思想:

Activity或Fragment的UI逻辑对象抽象成View Interface,业务逻辑抽象成Presenter Interface,M不变。

Activity上只做简单回调接口的数据渲染,组件的简单操作。剩下的耗时工作(网络请求)都交给Presenter去执行。Presenter是Model和View的桥梁,Presenter处理网络请求后拿到的数据实例化Model,然后再将Model通过View Interface回调给View。

MVC 和 MVP 的区别: MVP中的View不能对Model直接操作。

Android MVP UML图



Android MVP实现

实体类 - Topic

public class Topic {
/**
* 用户Id
*/
public Long userId;
/**
* 主题Id
*/
public Long topicId;
/**
* 主题内容
*/
public String content;
}


Presenter层回调View层接口 - IMvpView

public interface IMvpView {
/**
* 添加成功
* @param topic
*/
void addSuccess(Topic topic);

/**
* 删除成功
* @param topic
*/
void delSuccess(Topic topic);

/**
* 修改成功
* @param newTopic
*/
void modSuccess(Topic newTopic);

/**
* 查询成功
* @return
*/
void querySuccess(List<Topic> topics);

/**
* 发生错误
*/
void error();
}


Model层 接口 - ITopicModel

public interface ITopicModel {
/**
* 添加Topic
*
* @param topic
*/
void add(Topic topic);

/**
* 删除主题
*
* @param topic
*/
void del(Topic topic);

/**
* 修改主题
*
* @param topicId
* @param topic
*/
void mod(Long topicId, Topic topic);

/**
* 查询主题
*
* @return
*/
void query();
}


Model层回调Presenter层抽象类 - TopicModelCallBack

public abstract class TopicModelCallBack {
/**
* 添加成功
*
* @param topic
*/
public void addSuccess(Topic topic) {
}

/**
* 删除成功
*
* @param topic
*/
public void delSuccess(Topic topic) {
}

/**
* 修改成功
*
* @param newTopic
*/
public void modSuccess(Topic newTopic) {
}

/**
* 查询成功
*
* @return
*/
public void querySuccess(List<Topic> topics) {
}

/**
* 发生错误
*/
public abstract void error();
}


Model 实现类 - TopicModel

public class TopicModel implements ITopicModel {

private TopicModelCallBack callBack;

public TopicModel(TopicModelCallBack callBack) {
this.callBack = callBack;
}

/**
* 添加Topic
*
* @param topic
*/
@Override
public void add(Topic topic) {
// TODO ...网络请求后...

// TODO 返回数据 这里默认为返回原数据
this.callBack.addSuccess(topic);
}

/**
* 删除主题
*
* @param topic
*/
@Override
public void del(Topic topic) {
// TODO ...网络请求后...

// TODO 返回数据 这里默认为返回原数据
this.callBack.delSuccess(topic);
}

/**
* 修改主题
*
* @param topicId
* @param topic
*/
@Override
public void mod(Long topicId, Topic topic) {
// TODO ...网络请求后...

// TODO 返回数据 这里默认为返回原数据
this.callBack.modSuccess(topic);
}

/**
* 查询主题
*
* @return
*/
@Override
public void query() {
// TODO ...网络请求后...

// TODO 返回数据
Topic topic = new Topic();
topic.userId = 267L;
topic.topicId = 1267L;
topic.content = "Save you from anything";
List<Topic> list = new LinkedList<Topic>();
list.add(topic);
this.callBack.querySuccess(list);
}
}


Presenter层 - MvpPresenter

public class MvpPresenter {
private IMvpView iView;
private ITopicModel model;

public MvpPresenter(IMvpView iView) {
this.iView = iView;
this.model = new TopicModel(new TopicModelCallBack() {
/**
* 添加成功
*
* @param topic
*/
@Override
public void addSuccess(Topic topic) {
MvpPresenter.this.iView.addSuccess(topic);
}

/**
* 删除成功
*
* @param topic
*/
@Override
public void delSuccess(Topic topic) {
MvpPresenter.this.iView.delSuccess(topic);
}

/**
* 修改成功
*
* @param newTopic
*/
@Override
public void modSuccess(Topic newTopic) {
MvpPresenter.this.iView.modSuccess(newTopic);
}

/**
* 查询成功
*
* @param topics
* @return
*/
@Override
public void querySuccess(List<Topic> topics) {
MvpPresenter.this.iView.querySuccess(topics);
}

/**
* 发生错误
*/
@Override
public void error() {
MvpPresenter.this.iView.error();
}
});
}

/**
* 添加主题
*
* @param topic
*/
public void addTopic(Topic topic) {
this.model.add(topic);
}

/**
* 删除主题
*
* @param topic
*/
public void delTopic(Topic topic) {
this.model.del(topic);
}

/**
* 修改主题
*
* @param topic
*/
public void modTopic(Topic topic) {
this.model.mod(topic.topicId, topic);
}

/**
* 查询主题
*/
public void queryTopic() {
this.model.query();
}

}


Activity

public class MvpActivity extends AppCompatActivity implements IMvpView {

private TextView addTV;
private TextView delTV;
private TextView modTV;
private TextView queryTV;

private MvpPresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);

this.addTV = (TextView) this.findViewById(R.id.add_tv);
this.delTV = (TextView) this.findViewById(R.id.del_tv);
this.modTV = (TextView) this.findViewById(R.id.mod_tv);
this.queryTV = (TextView) this.findViewById(R.id.query_tv);

this.presenter = new MvpPresenter(this);

Topic topic = new Topic();
topic.userId = 267L;
topic.topicId = 1267L;
topic.content = "Save you from anything";

this.presenter.addTopic(topic);
this.presenter.delTopic(topic);
this.presenter.modTopic(topic);
this.presenter.queryTopic();

}

/**
* 添加成功
*
* @param topic
*/
@Override
public void addSuccess(Topic topic) {
Log.i("MvpActivity", topic.content);
this.addTV.setText("Add:"+topic.content);
}

/**
* 删除成功
*
* @param topic
*/
@Override
public void delSuccess(Topic topic) {
Log.i("MvpActivity",topic.content);
this.delTV.setText("Del:"+topic.content);
}

/**
* 修改成功
*
* @param newTopic
*/
@Override
public void modSuccess(Topic newTopic) {
Log.i("MvpActivity", newTopic.content);
this.modTV.setText("Mod:" + newTopic.content);
}

/**
* 发生错误
*/
@Override
public void error() {

}

/**
* 查询成功
*
* @param list
* @return
*/
@Override
public void querySuccess(List<Topic> list) {
Topic topic = list.get(0);
Log.i("MvpActivity",topic.content);
this.queryTV.setText("Query:"+topic.content);
}
}


Android MVP项目结构



Android MVP作用

在Android上,分离了View和Controller,大大降低了耦合度。

Activity只处理简单的事情,代码干净。

Presenter被抽象出来可以有多种具体的实现,方便进行单元测试。

Presenter和View都独立出来了,不互相耦合,提升了各自功能的特点和可读性(比如Presenter就是干这个的,View是干这个的,很容易看出来)。

网络的耗时任务内,可能Activity的引用还被耗时任务引用着,这样会造成内存泄露,如果业务逻辑交给Presenter,可以在onDestory的时候让Presenter分离耗时任务和Activity的引用。

代码下载

Mvp4Android Demo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息