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 ...
随机推荐
- bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
最大半联通子图对应缩点后的$DAG$上的最长链 复杂度$O(n + m)$ #include <cstdio> #include <cstring> #include < ...
- [CC-STREETTA]The Street
[CC-STREETTA]The Street 题目大意: 给定两个长度为\(n(n\le10^9)\)的数列\(A\)和\(B\),开始数列\(A\)中每一项值为\(-\infty\),数列\(B\ ...
- php -- 解决php连接sqlserver2005中文乱码问题(附详细解决方法)
@_@~~ --php5.2 --phpstudy --apache --sqlserver2005 @_@~~问题描述 问题一:php连接sqlsever2005,输入中文,然后查询sqlserve ...
- python开发_python日期操作
在python中对日期进行操作的库有: import datetime import time 对日期格式化信息,可以参考官方API: time.strftime datetime 下面是我做的dem ...
- 更新teaching中fdSubjectID为null的老数据
UPDATE wkwke.tbTeachingV3 teaching SET teaching.fdSubjectID = ( SELECT fdValue FR ...
- linux基础命令学习(十二)yum命令
主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 yum list|more 列出所有包文件,可搭配grep查 ...
- 客户端获取ip
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 从网络得到数据--Arduino+以太网
昨天我们讨论了如何使用Arduino以太网插板建立服务器,并通过网络控制Arduino的引脚.今天我们来看看用插板做为客户端来从一个网页上得到信息并返回报告.我几个月前用的这个方法,当时我做了一个Ni ...
- POJ 1286 Necklace of Beads(Polya简单应用)
Necklace of Beads 大意:3种颜色的珠子,n个串在一起,旋转变换跟反转变换假设同样就算是同一种,问会有多少种不同的组合. 思路:正规学Polya的第一道题,在楠神的带领下,理解的还算挺 ...
- FreeRTOS Memory Management ( IAR )
http://www.freertos.org/a00111.html The RTOS kernel allocates RAM each time a task, queue, mutex, so ...