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实现
实体类 - Topicpublic 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相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件