Android MVP 架构一 View与Presenter
View:主要负责界面的显示及跟数据无关的逻辑,比如设置控件的点击事件等
Presenter:主要负责View与Model的交互
Model:数据部分
-------
MVP的核心是:
View层不持有Model层对象任何引用,当然参数里面和临时变量里可以有Model层对象,只持有Presenter层对象引用,任何需要更新或者操作数据的,都间接通过Presenter对象去操作数据。而Model层想要操作View层是无法实现的,必须通过Presenter层。
Presenter层持有View层对象的引用,除此之外不持有其他的UI控件等的引用,Model层会把想要更新View的操作委托Presenter去操作,而Presenter层会把更新View操作交给View层对象去操作。
-------
1、view 层,实现:
public class GoodsActivity extends Activity implements ViewPager.OnPageChangeListener, OnPageClickListener, ShoppingMarkContentView {
2、ShoppingMarkContentView :
package com.wbh.mall.views.iviews; import com.wbh.mall.restful.bean.GoodDTO;
import com.wbh.mall.restful.bean.UserDataListDTO; import java.util.List; public abstract interface ShoppingMarkContentView {
public abstract void refershRecommendItemList(List<GoodDTO> paramList); public abstract void refreshCollectSameMarkUserInfo(UserDataListDTO paramUserDataListDTO); public abstract void refreshItemDetail(GoodDTO paramGoodDTO); public abstract void setFollow(short paramShort);
}
3、在GoodsActivity 中实现上面的方法:
@Override
@SuppressLint({"MissingSuperCall"})
protected void onResume() {
super.onResume();
this.markContentPresenter.start();
} @Override
public void refershRecommendItemList(List<GoodDTO> paramList) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if ((paramList != null) && (!paramList.isEmpty())) {
GoodsActivity.this.recommend_good_container.setVisibility(0);
GoodsActivity.this.recommendGoodListAdapter.goodDTOS.addAll(paramList);
GoodsActivity.this.recommend_good_list_recyclerview.notifyFinish();
}
}
});
}
其实在他上面有个入口:
@Override
public void onCreate(Bundle savedInstanceState) {
this.markContentPresenter.tuijianGoods(false);
public void tuijianGoods(boolean b) { if (!b) {
this.manager.current_page = 1;
this.lastUpDate = DateUtil.getCurrentTime();
} int j = this.manager.page_num;
int i = this.manager.current_page;
long l = this.lastUpDate;
String str = this.articleId;
if (TextUtils.isEmpty(this.itemUrl) == true) { }
StringBuilder sb = new StringBuilder();
sb.append(this.num_iid);
sb.append("");
markSource.tuiJianGoods(j, i, l, str, sb.toString());
}
在 public class ShoppingMarkContentPresenter extends Presenter {中定义上面的方法;
4、请求服务器:
public class MarkRestSource extends RestSource {
public void tuiJianGoods(int paramInt1, int paramInt2, long paramLong, String paramString1, String paramString2) {
Map localMap = createPhoneInfoMap();
localMap.put("pageSize", Integer.valueOf(paramInt1));
localMap.put("pageNo", Integer.valueOf(paramInt2));
localMap.put("lastUpDate", Long.valueOf(paramLong));
if (!TextUtils.isEmpty(paramString1)) {
localMap.put("articleId", paramString1);
}
if (!TextUtils.isEmpty(paramString2)) {
localMap.put("num_iid", paramString2);
}
cleanNullParams(localMap);
this.markApi.tuiJianGoods(localMap).enqueue(new Callback() { @Override
public void onResponse(Call call, Response response) {
int i = response.code();
if (i == 200) {
MarkRestSource.this.storeToken(((MarkRestResponse.TuijianGoodsResponse) response.body()).token);
MarkRestSource.this.dataBus.post(response.body());
} else {
MarkRestSource.this.dataBus.post(new MarkRestResponse.TuijianGoodsResponse(Integer.valueOf(i)));
}
} @Override
public void onFailure(Call call, Throwable throwable) {
MarkRestSource.this.dataBus.post(new MarkRestResponse.TuijianGoodsResponse(Integer.valueOf(2000)));
} });
}
BUS 事件传递
/**
* 订阅事件 EventBus @Subscribe
*
* @return Result<Xxxx>
*/
@Subscribe
public void tuijianGoodsResponse(MarkRestResponse.TuijianGoodsResponse paramTuijianGoodsResponse)
{
try
{
if ((paramTuijianGoodsResponse.code == 200) && (paramTuijianGoodsResponse.data != null)
&& paramTuijianGoodsResponse.data.list != null)
{
this.lastUpDate = paramTuijianGoodsResponse.data.lastUpDate;
PageManager localPageManager = this.manager;
boolean isLastPage;
if (paramTuijianGoodsResponse.data.isLastPage == 0) {
isLastPage = false;
} else {
isLastPage = true;
}
localPageManager.isLastPage = isLastPage;
this.markContentView.refershRecommendItemList(paramTuijianGoodsResponse.data.list);
if (TextUtils.isEmpty(this.itemUrl)) {
storeMarkrRecords(paramTuijianGoodsResponse.data.list);
}
}
else
{
this.markContentView.refershRecommendItemList(null);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
Android MVP 架构一 View与Presenter的更多相关文章
- [Android] Android MVP 架构下 最简单的 代码实现
Android MVP 架构下 最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...
- Android MVP架构分析
App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP.MVVM.Clean这三种.google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式 ...
- Android MVP架构浅析
Android之MVC模式 MVC好处: 从用户的角度出发,用户可以根据自己的需求,选择自己合适的浏览数据的方式.比如说,对于一篇在线文档,用户可以选择以HTML网页的方式阅读,也可以选择以pdf的方 ...
- 转:Android开发中的MVP架构(最后链接资源不错)
Android开发中的MVP架构 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和 ...
- 转: Android开发中的MVP架构详解(附加链接比较不错)
转: http://www.codeceo.com/article/android-mvp-artch.html 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解M ...
- 设计模式笔记之二:Android开发中的MVP架构(转)
写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn ...
- Android MVPR 架构模式
最近我在尝试让 Google 的 IO App 变得可单元测试,我这样做的其中一个原因是验证 Freeman 和 Pryce 在引用中对单元测试的总结.即使现在我还是没有把 IOSched 中的任何一 ...
- android 开发架构学习
Android DataBinding(数据绑定)入门与实战 http://examplecode.cn/2018/07/20/android-databinding-01-introduction/ ...
- 转:Android官方MVP架构示例项目解析
转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...
随机推荐
- jvm相关参数
官方地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE 一.查看jvm运行参数 1.查看 ...
- Java使用RabbitMQ之整合Spring(生产者)
依赖包 <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org.springframework.amq ...
- LVS (Linux Virtual Server) 负载均衡
[大型网站技术实践]初级篇:借助LVS+Keepalived实现负载均衡 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服 ...
- github-share报错无法读取远程仓库
报错:github Could not read from remote repository 1.github创建仓库成功,而push报告此错误 2.考虑远程仓库名与本地项目名/文件夹名不匹配 3. ...
- scrapy爬取知乎问答
登陆 参考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time impor ...
- CODEFORCES掉RATING记 #1
时间:2017.7.16晚 比赛:Educational Codeforces Round 25 比赛开始前去睡觉了...开始后5min才起来 一进去就点开AB,B先加载好,就先做了B.读完题后发现是 ...
- Pfsense2.34中文版
Pfsense2.34中文版 来源 https://forum.netgate.com/topic/112076/pfsense2-34%E4%B8%AD%E6%96%87%E7%89%88-%E8 ...
- php+redis配置
系统环境: win10+phpstudy+lamp 安装扩展 php5.6.4 =>下载地址:http://windows.php.net/downloads/pecl/releases/red ...
- P3613 睡觉困难综合征(LCT + 位运算)
题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...
- a span做成按钮样式不选中文字
a,span做成按钮样式时,文字会被选中.加以下CSS可以让其不选中.测试三大浏览器都可以 .button { display: inline-block; -moz-user-select: non ...