听到很多人在讨论MVVM,我自己早些时候也写过一篇介绍MVVM的文章(玩转Android之MVVM开发模式实战,炫酷的DataBinding!),实际上,在Android开发领域中,除了MVVM之外,MVP也是一个非常好用的开发模式。至于什么是MVC、什么是MVP什么是MVVM应该不用我说了吧,本文我主要是想通过一个案例来带小伙伴们看看如何在我们的项目中使用MVP。关于MVP的太多的理论知识小伙伴们自行搜索。

OK,我们先来看看项目效果图:

就这样一个东东,直接写当然很简单,一个Activity中放一个ListView,那么今天我们来看看用MVP的方式怎么实现这样的效果。OK,首先来看看项目结构:

数据全部由Model包中的类和方法提供,视图的现实全部由view包中的控件实现,view包中的控件和model中的数据不直接接触,全部通过presenter来实现两者之间的组合。OK,整体思路就是这样,我们先来看看model中的数据提供类吧:

ILoadFoodData.java:

public interface ILoadFoodData {
public void getData(String httpUrl,OnDataLoadListener onDataLoadListener);
}

就一个功能,获取数据,第一个参数是数据地址,第二个参数是获取数据的监听器,OK,那我们再来看看这个接口的实现类:

public class LoadFoodDataImpl implements ILoadFoodData {
@Override
public void getData(String httpUrl, final OnDataLoadListener onDataLoadListener) {
final Request request = new Request.Builder()
.url(httpUrl)
.build();
Call call = OkHttpUtil.getOkHttpClient().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
onDataLoadListener.onFailed(e.getMessage());
} @Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
onDataLoadListener.onSuccess(JsonParse.parseJson2FoodList(response.body().string()));
} else {
onDataLoadListener.onFailed("数据加载失败");
}
}
});
}
}

数据下载成功之后先把数据转化为集合,然后调用OnDataLoadListener中相应的方法即可。OK,那我们再来看看OnDataLoadListener:

public interface OnDataLoadListener {
public void onSuccess(List<FoodEntity> foodEntities); public void onFailed(String errorMsg);
}

至于其他的数据下载类等我这里就不贴出来了,小伙伴们可以直接文末下载源码阅读。

OK,这里就是我们的数据提供类,接下来看看View,将Activity需要实现的功能抽象成相应的接口,我这里设置了如下一些功能:

public interface IFoodView {
//显示加载进度条
public void showLoading();
//隐藏加载进度条
public void hideLoading();
//给ListView设置数据源
public void initData(MyAdapter adapter);
//显示错误信息
public void showErrorMsg(String errorMsg);
}

OK,那我们来看看我们的Activity是什么样子:

public class MainActivity extends AppCompatActivity implements IFoodView {

    private ListView lv;
private FoodPresenter presenter = new FoodPresenter(this);
private ProgressBar pb; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
presenter.loadData();
} private void initView() {
lv = (ListView) findViewById(R.id.lv);
pb = ((ProgressBar) findViewById(R.id.pb));
} @Override
public void showLoading() {
pb.setVisibility(View.VISIBLE);
} @Override
public void hideLoading() {
pb.setVisibility(View.GONE);
} @Override
public void initData(MyAdapter adapter) {
lv.setAdapter(adapter);
} @Override
public void showErrorMsg(String errorMsg) {
Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show();
}
}

这里的代码都很简单,不用多说,这里小伙伴们需要牢记的就是View类中不要直接和Model中的数据进行对接就好,所有的对接都放在Presenter中:

public class FoodPresenter {
private IFoodView iFoodView;
private ILoadFoodData iLoadFoodData;
private Context context;
private Handler mHandler = new Handler(); public FoodPresenter(IFoodView iFoodView) {
this.iFoodView = iFoodView;
this.context = (Context) iFoodView;
iLoadFoodData = new LoadFoodDataImpl();
} public void loadData() {
iFoodView.showLoading();
iLoadFoodData.getData(Constant.LISTURL, new OnDataLoadListener() {
//小伙伴们注意这个方法是在子线程中回调的,现在要在主线程中更新UI
@Override
public void onSuccess(final List<FoodEntity> foodEntities) {
mHandler.post(new Runnable() {
@Override
public void run() {
iFoodView.initData(new MyAdapter(foodEntities,context));
iFoodView.hideLoading();
}
});
} @Override
public void onFailed(final String errorMsg) {
mHandler.post(new Runnable() {
@Override
public void run() {
iFoodView.showErrorMsg(errorMsg);
iFoodView.hideLoading();
}
});
}
});
}
}

如上代码,在presenter中将数据和View再组合到一起。

OK,就这样一个小小的案例,希望小伙伴能够借此一窥MVP这种开发模式。如果大家对MVP这种开发模式的理论还有什么疑问的话,欢迎留言讨论。

源码下载https://github.com/lenve/HealthyFoodMVP

以上。

如何使用MVP模式搭建我们的Android应用?的更多相关文章

  1. Android架构篇--MVP模式的介绍篇

    摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经在商业项目中从零开始大规模采用过MVP模式对项目进行开发.在使用MVP模式进行开发的时候发现项目的结构模式对开发是有一定的 ...

  2. 在Andoid开发中使用MVP模式来解耦,增加可测试性

    by Jeff Angelini posted on 7/20/2011 2:35:00 PM 将应用程序UI的表现从Ui的逻辑中分离是一个好的想法.这种分离减少了代码耦合,代码更加干净, 甚至可以有 ...

  3. MVP模式(Android)

    以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...

  4. MVP模式在Android项目中的使用

    以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...

  5. 【Android - 框架】之MVP模式的使用

    提起MVP架构模式,大家可能首先想到的是它的"前辈"MVC模式.MVC由Model.View.Controller组成,请求从Controller进入后进行业务判断,然后交给Mod ...

  6. MVP模式在Android中的使用

    转载了一篇博客.博客来自:http://www.liuling123.com/2015/12/mvp-pattern-android.html 觉得博主写的非常好 曾经在写项目的时候.没有过多考虑架构 ...

  7. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  8. [译]Google官方关于Android架构中MVP模式的示例

    概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...

  9. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

随机推荐

  1. Socket编程基础——无连接UDP

    与面向连接的网络连接相比,无连接的网络通信不需要在服务器与客户端之间建立连接.面向非连接的Socket通信是基于UDP的,服务器端不需要调用listen()和accept()函数来等待客户端的连接:客 ...

  2. 开发工具及服务年度大奖评选 I Bugtags 荣获最具成长潜力奖

    作为全球最大中文 IT 社区和服务平台.中国最大技术管理者平台的 CSDN 在中国北京总部举办了一场 2015 年开发工具及服务年度大奖评选活动,此次活动目的在于推动开发服务及工具质量的提升,提高行业 ...

  3. Hadoop on Mac with IntelliJ IDEA - 9 解决Type mismatch in value from map问题

    修改陆喜恒. Hadoop实战(第2版)5.3排序的代码时遇到IO异常. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 异常具体信息如下 ...

  4. 利用URLScan工具过滤URL中的特殊字符(仅针对IIS6)

    客户公司搞安全检查,扫描出来我们之前做的系统有一个高危漏洞:IIS tilde directory enumeration,也就是利用“~”字符猜解暴露短文件/文件夹名,比如,采用这种方式构造URL: ...

  5. 卸载CentOS 5.4自带的OpenJDK,配置新的Java环境

    本文CentOS版本为5.4 final,使用图形界面与命令结合的操作方式,由于CentOS 5.4在默认情况下,会安装OpenOffice之类的软件,而这些软件需要Java支持,因此系统会默认安装一 ...

  6. 2、Lucene 最简单的使用(小例子)

    在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索: 1.下载Lucene 下载Lucene,到Lucene的官 ...

  7. NSIS皮肤插件

    原文 NSIS皮肤插件 [有一个更好的皮肤,大家不妨试一下.http://www.flighty.cn/html/bushu/20110413_118.html ] 对于一般的安装不推荐使用皮肤,因为 ...

  8. DotNetCore跨平台~linux上还原自主nuget包需要注意的问题

    问题的产生的背景 由于我们使用了jenkins进行部署(jenkins~集群分发功能和职责处理),而对于.net core项目来说又是跨平台的,所以对它的项目拉取,包的还原,项目的编译和项目的发布都是 ...

  9. 邓_html_图片轮播

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. easyUI文本框获得焦点,失去焦点

    easyUI帮助文档对于文本框的操作没有提供直接获得焦点,或者失去焦点的方法,我们可以采用以下写法来实现. 获得焦点: $('input',$('#文本框Id').next('span')).focu ...