Android中的MVP模式初步使用
为什么80%的码农都做不了架构师?>>>
之前在做javaweb的项目的时候,最开始接触的mvc结构作为做根本的结构,在Android项目中 Google本身设计的Android项目就是一个mvc的结构 model(模型),view(视图),Control(控制),Android的布局全部采用xml进行编写 就相当于view层,model则大多数对应于我们的本地数据库读取以及进行网络数据的读取操作,Control 对应于我们的view与model之间的桥梁 ,那就是我们的activity会通常起到这个作用.数据发起访问 xml控件初始化 刷新界面等等. 那么现在讲到MVP model(模型) view(视图) Presenter(交互中间人的意思,其实有点类似于control) 在传统的MVC中,Activity担当了Control的角色,同时还要负责Dialog,Toast,PopupWindow的弹出,这就往往让Activity的责任变得繁重。一个Activity可能动不动就是几千行代码。而在MVP中View的角色不仅仅只是XML,而变成了Activity,Activity只负责View的工作。结合上面说的MVP能使Model和View之间能完全解耦,也就是说,在Activity中不会有任何关于Model层的操作,这就符合面向对象设计原则中的单一职责,让各个模块只负责自己的部分。更易于维护,代码也会更加清晰简单,上代码:
Bean:
public class NewsInfo implements Serializable {
private static final long serialVersionUID = 1L;
private String datetime;
private int id;
private String title;
private String imageUrl;
private String abstractInfo;
省略若干get()set()..... public NewsInfo(String datetime, int id, String title, String imageUrl,
String abstractInfo) {
super();
this.datetime = datetime;
this.id = id;
this.title = title;
this.imageUrl = imageUrl;
this.abstractInfo = abstractInfo;
}
public NewsInfo() {
}
}
Model层的接口:面向接口编程,依赖于抽象 public interface INewsModel {
/** * 加载数据 * * [@param](http://my.oschina.net/u/2303379) dataListener */
void loadNews(IOnDataListener<List<NewsInfo>> dataListener); /** * 缓存数据 * * [@param](http://my.oschina.net/u/2303379) listNews */
void saveNews(List<NewsInfo> listNews);
}
Model实现类: public class NewsModelImpl implements INewsModel {
@Override
public void loadNews(final IOnDataListener<List<NewsInfo>> dataListener) { // 回调接口 NewsNetHelper netHelper = new NewsNetHelper(); netHelper.setDataListener(new UIDataListener<List<NewsInfo>>() { @Override public void onDataChanged(List<NewsInfo> data) { if (data == null) { dataListener.error(); } else { dataListener.completeLoad(data); } } }); netHelper .doHttpGet("http://toutiao.com/api/article/recent/?source=2&count=20&category=__all__&max_behot_time=1449467901.41&utm_source=toutiao&offset=0&_=1449468004256");
} @Override
public void saveNews(List<NewsInfo> listNews) { // 缓存数据到本地
}
}
View层接口:依赖于抽象编程 public interface INewsView {
/** * 显示新闻列表 *
* @param listNews */
public void showNewsList(List<NewsInfo> listNews);
/** * 显示正在加载中进度条 */
public void showLoading(); /** * 关闭正在加载中进度条 */
public void hideLoading(); /** * 显示数据加载失败 */
public void showError();
}
MVP关键之处:中间人Presenter public class NewsPresenter {
// 同时持有Model层和View层的引用
private INewsView mNewsView;
private INewsModel mNewsModel = new NewsModelImpl();
public NewsPresenter(INewsView newsView) { this.mNewsView = newsView;
}
public void showNews() { mNewsView.showLoading(); mNewsModel.loadNews(new IOnDataListener<List<NewsInfo>>() { @Override public void error() { // 加载失败 mNewsView.hideLoading(); mNewsView.showError(); } @Override public void completeLoad(List<NewsInfo> t) { mNewsView.hideLoading(); mNewsView.showNewsList(t); } });
}
}
Activity实现了View接口 [java] view plain copy package himan.mvp;
import himan.mvp.adapter.NewsAdapter;
import himan.mvp.bean.NewsInfo;
import himan.mvp.net.volley.VolleyQueueController;
import himan.mvp.presenter.NewsPresenter;
import himan.mvp.utils.LoadingWindow;
import himan.mvp.view.INewsView;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
/**
- 测试 加载的数据 是从今日头条官网的直接push下来的
- @author Mr.Himan
*/
public class MainActivity extends Activity implements INewsView {
private ListView mlVNews; private NewsAdapter mNewsAdapter; private List<NewsInfo> mListNews; private NewsPresenter mNewsPresenter; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化Volley框架 VolleyQueueController.init(this); // ImageLoader 默认配置参数 ImageLoaderConfiguration configuration = ImageLoaderConfiguration .createDefault(this); // 初始化ImageLoader ImageLoader.getInstance().init(configuration); initView(); mNewsPresenter = new NewsPresenter(this); mNewsPresenter.showNews(); } private void initView() { mlVNews = (ListView) findViewById(R.id.news_lv_news_list); mListNews = new ArrayList<NewsInfo>(); mNewsAdapter = new NewsAdapter(this, mListNews, R.layout.lv_item_news); mlVNews.setAdapter(mNewsAdapter);
} @Override
public void showNewsList(List<NewsInfo> listNews) { mListNews.addAll(listNews); mNewsAdapter.notifyDataSetChanged();
} @Override
public void showLoading() { Toast.makeText(this, "正在加载数据...", Toast.LENGTH_LONG).show();
} @Override
public void hideLoading() { Toast.makeText(this, "数据加载成功", Toast.LENGTH_SHORT).show();
} @Override
public void showError() { }
}
以上是加载的一个新闻列表 ,Activity实现了View接口,而Presenter中保存有View和Model层的引用,使得Presenter能通过Model拿到数据,通过View的引用控制视图的显示。流程大概是这样,Presenter先通过Model的引用拿到数据,然后通过View的引用进行数据的显示,视图更新。Activity中的代码也非常简介。通过上面代码我们能够看出MVP的优点还是很多的,首先使得Model和View层完全解耦,我们知道项目中改动最多的一般都是View层,这就让程序易于维护,而且能够高度复用Presenter,而且也易于后期的拓展。缺点也显而易见,就是爆炸式增长的类和接口。复用的时候也可能造成接口的冗余。最大的问题是Presenter持有着View的强应用,在请求网络数据等耗时操作的时候,Activity可能被销毁,可能会导致View无法回收,而造成内存问题。
转载于:https://my.oschina.net/Gxhpro/blog/740402
Android中的MVP模式初步使用相关推荐
- android中的mvp模式怎么定义,详解MVP模式在Android开发中的应用
一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Mode ...
- Android 中的MVP 模式
MVP模式的核心思想: MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成功接口,Model类还是原来的Model. MVC 其中View层其实就是程序的UI界面,用于向用户展示 ...
- android中的mvp模式怎么定义,在android中使用MVP模式
1.MVP介绍java 随着UI建立技术的功能日益加强,UI层也履行着愈来愈多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专一于处理数 据的可视化以及与用户的交互,同时 ...
- Android中的MVP模式学习
文章目录 1. MVP模式简介 1.1 MVP所对应的意义 2. MVP模式的应用 2.1 model层描述和具体代码 2.2 view层描述和具体代码 2.3 presenter层描述和具体代码 2 ...
- Android当中的MVP模式(七)终篇---关于对MVP模式中代码臃肿
个人博客:CODE FRAMER BIGZ MVP系列文章配套DEMO Android 当中的 MVP 模式(一)基本概念 Android 当中的 MVP 模式(二)封装 Android 当中的 MV ...
- 浅谈Android中的MVP与动态代理的结合
浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...
- android mvp模式鸿洋,Android上的MVP模式
什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不是一个结构化的模式,它 ...
- Android中Activity启动模式
Android中Activity启动模式一共是四种,这里我写一下我对其的理解: 1.standard(默认) 2.singleTop,如果某个Activity设置了该属性,且当前Activity就是这 ...
- android中的recovery模式
这里使用基于freescale的imx_r9.2 patch的android源码分析. android中的recovery模式,作为android的开发者或者用户都应该清楚和了解.android利用r ...
最新文章
- 2021年大数据基础(一):大数据概念
- PCLint使用(一)
- 关闭不安全端口的脚步
- 技术系列课|网易云信音视频通话2.0产品中的美声/变声功能
- 怎么用c语言写一个贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
- Android之智能问答机器人
- Spring之WebSocket网页聊天以及服务器推送
- 第 9 章 代码审查制度
- 线程、线程与进程、ULT与KLT
- java怎么改变数组的名,java – Spring HATEOASHAL:在_embedded中更改数组名称
- ATHK弄出个有道词典加入生词本的快接键...
- 数塔 简单的 动态规划
- [java]内部类的总结
- Photoshop教程:10秒闪电搞定照片构图
- AUTOSAR CAN Wakeup Analysis
- matlab学习五,二元函数绘图方法
- 【一步步学OpenGL 39】 -《模型轮廓识别检测[阴影锥1]》
- apche的log4j.properties和log4j2.xml的配置和使用
- 2019年的第一场雪来的既猛又烈,突然想分享点东西
- matlab中normfit的使用