Android MVP 构架初试
目前讨论MVP MVVM 的架构也来越多,这种构架也很适合Android。研究MVP记录如下
源码地址RxMVP分支Tag02
原有的MVC构架
刚开始接触Android的时候会觉得Android的整个代码架构就是一个MVC。
- M : 业务层和模型层,相当与javabean和我们的业务请求代码
- V : 视图层,对应Android的layout.xml布局文件
- C : 控制层,对应于Activity中对于UI 的各种操作
看起来MVC架构很清晰,但是实际的开发中,请求的业务代码往往被丢到了Activity里面,大家都知道layout.xml的布局文件只能提供默认的UI设置,所以开发中视图层的变化也被丢到了Activity里面,再加上Activity本身承担着控制层的责任。所以Activity达成了MVC集合的成就,最终我们的Activity就变得越来越难看,从几百行变成了几千行。维护的成本也越来越高
新的MVP架构
- M : 还是业务层和模型层
- V : 视图层的责任由Activity来担当
- P : 新成员Prensenter 用来代理 C(control) 控制层
MVP与MVC最大的不同,其实是Activity职责的变化,由原来的C (控制层) 变成了 V(视图层),不再管控制层的问题,只管如何去显示。控制层的角色就由我们的新人 Presenter来担当,这种架构就解决了Activity过度耦合控制层和视图层的问题。
一个简单实践

声明了一个接口,带有请求数据业务的方法
RequestBiz
public interface RequestBiz {
//请求数据业务
void requestForData(OnRequestListener listener);
}
RequestBizIml
请求的实现类为了模拟网络请求,开启了一个会sleep 10秒的线程,然后装填请求的数据,通过OnRequestListener 接口回调出去,与我们平时开发的方式一致。
public class RequestBizIml implements RequestBiz {
@Override
public void requestForData(final OnRequestListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000*10);
ArrayList<String> data = new ArrayList<String>();
for(int i = 1 ; i< 10 ; i++){
data.add("item"+i);
}
if(null != listener){
listener.onSuccess(data);
}
}catch(Exception e){
e.printStackTrace();
}
}
}).start();
}
}
OnRequestListener
数据请求的回掉接口,声明了成功和失败的方法 。
public interface OnRequestListener {
void onSuccess(List<String> data);
void onFailed();
}
到此业务层完成,开始MVP的写法.
由于Activity变成了view层不再去控制界面,但是具体的界面的改变api其实还是由Activity来提供的,所以在写MVP之前需要思考,View层需要哪些方法。
- 显示loading
- 隐藏loading
- listview的初始化
- 弹出Toast消息
MvpView
写MvpView之前接口需要想想界面有哪些交互,根据业务逻辑来确定
public interface MvpView {
//显示loading progress
void showLoading();
//隐藏loading progress
void hideLoading();
//ListView的初始化
void setListItem(List<String> data);
//Toast 消息
void showMessage(String messgae);
}
接下来开始写presenter层, 同样在写presenter之前想想控制层需要哪些方法
- 网络请求
- 点击事件
public class MvpPresenter {
private MvpView mvpView;
RequestBiz requestBiz;
private Handler mHandler;
public MvpPresenter(MvpView mvpView) {
this.mvpView = mvpView;
requestBiz = new RequestBizIml();
mHandler = new Handler(Looper.getMainLooper());
}
public void onResume(){
mvpView.showLoading();
requestBiz.requestForData(new OnRequestListener() {
@Override
public void onSuccess(final List<String> data) {
//由于请求开启了新线程,所以用handler去更新界面
mHandler.post(new Runnable() {
@Override
public void run() {
mvpView.hideLoading();
mvpView.setListItem(data);
}
});
}
@Override
public void onFailed() {
mvpView.showMessage("请求失败");
}
});
}
public void onDestroy(){
mvpView = null;
}
public void onItemClick(int position){
mvpView.showMessage("点击了item" + position);
}
}
Presenter完成,现在就剩下一件事,Activity中使用Presenter
完整版MVPActivity
public class MVPActivity extends AppCompatActivity implements MvpView, AdapterView.OnItemClickListener {
@BindView(R.id.mvp_listview)
ListView mvpListView;
MvpPresenter mvpPresenter;
SweetAlertDialog pd;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext= this;
ButterKnife.bind(this);
mvpListView.setOnItemClickListener(this);
mvpPresenter = new MvpPresenter(this);
}
@Override
protected void onResume() {
super.onResume();
mvpPresenter.onResume();
}
@Override
protected void onDestroy() {
mvpPresenter.onDestroy();
super.onDestroy();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mvpPresenter.onItemClick(position);
}
@Override
public void showLoading() {
if (pd == null) {
pd = new SweetAlertDialog(mContext, SweetAlertDialog.PROGRESS_TYPE);
pd.getProgressHelper().setBarColor(Color.parseColor("#A5DC86"));
pd.setTitleText("Loading");
pd.setCancelable(true);
}
pd.show();
}
@Override
public void hideLoading() {
pd.hide();
}
@Override
public void setListItem(List<String> data) {
ArrayAdapter adapter = new ArrayAdapter(MVPActivity.this,
android.R.layout.simple_list_item_1, data);
mvpListView.setAdapter(adapter);
}
@Override
public void showMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
源码地址:https://github.com/Javen205/RxMVP
转载: http://blog.csdn.net/dantestones/article/details/50899235
Android MVP 构架初试的更多相关文章
- Android MVP 构架封装
上一篇我们简单实现了一个MVP的构架,下面我们来做一个简单的封装使其使用更简单方便 源码地址RxMVP分支Tag03 最终实现目录结构如下 BasePresenter 如果每一个Activity都需要 ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- [Android]Android MVP&依赖注入&单元测试
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...
- Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化
Android MVP粗来已经有段时间了,在项目中我也多多少少用了一些,不得不说代码使用这种模式后,条例确实清晰了好多,整个流程看起来有点各司其职的感觉(另一种的java面向对象的方式). 不过这里是 ...
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- 结合实例分析Android MVP的实现
最近阅读项目的源码,发现项目中有MVP的痕迹,但是自己却不能很好地理解相关的代码实现逻辑.主要原因是自己对于MVP的理解过于概念话,还没有真正操作过.本文打算分析一个MVP的简单实例,帮助自己更好的理 ...
- 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)
转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ...
随机推荐
- Mybatis源码分析之结果集处理
解析封装 ResultMap 是和结果集相关的东西,最初在解析 XML 的时候,于 parseStatementNode 方法中,针对每一个 select 节点进行解析,转换为 MappedState ...
- http request GET 乱码分析
提交一个GET请求 在浏览器地址栏或搜索框输入地址:http://www.baidu.com/content/衣服?keyword=衬衣 其中的中文会被浏览器进行编码,具体编码情况请参考阮大神:关于U ...
- oracle date 看时间
SELECT to_char(DATE_TIME,'yyyy-MM-dd HH24:mi:ss') FROM AUDIT_EVENT;
- hdu 1253
D - 胜利大逃亡 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- vmware12中centos7以NAT连接网络
1.第一步当然是安装VM和安装CentOS,我用的是VM12和64位的CentOS7,怎么安装在我的其他文中有写到: http://www.cnblogs.com/wuyx/p/7246675.htm ...
- 【BZOJ 1272】 1272: [BeiJingWc2008]Gate Of Babylon (容斥原理+卢卡斯定理)
1272: [BeiJingWc2008]Gate Of Babylon Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 254 Solved: 12 ...
- 《时间序列分析——基于R》王燕,读书笔记
笔记: 一.检验: 1.平稳性检验: 图检验方法: 时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列 自相关图检验:(acf函数)平稳序列具有短期相关性,即随着延迟期数k的增加 ...
- python开发_python日期操作
在python中对日期进行操作的库有: import datetime import time 对日期格式化信息,可以参考官方API: time.strftime datetime 下面是我做的dem ...
- [转]android中drawable资源的解释及例子
原文链接: http://blog.csdn.net/wode_dream/article/details/38584693 文章中的内容参考Dev Guide中的Drawable R ...
- Swift 自定义打印方法
Swift 自定义打印方法 代码如下 // MARK:- 自定义打印方法 func MLLog<T>(_ message : T, file : String = #file, funcN ...