Android Mvp架构详解
注意点:
- IView和IModel是顶层接口,接口中没有任何方法,用于多态。
- SingleInterfaceContract中View和Presenter接口以及ISingleInterfaceModel三个接口定义了MVP三层需要实现用于对方调用的方法。
- V层的基类BaseMVPActivity持有P层的对象,该对象在实现类中初始化,V层需要获取数据只要调用该对象2中对应的方法即可。
- P层的基类BasePresenter持有V层的对象,该对象在V层调用attach方法的时候初始化,P层需要返回数据只要调用该对象2中对应的方法即可。
- P层的实现类SingleInterfacePresenter持有M层的对象,该对象在P层实现类构造函数初始化,在V层需要获取数据后,P层调用该对象2中对应的方法并把返回的数据返回给V层。
- 对于上述三个主要接口,V层和M层接口用于P层调用,P层接口用于V层调用。
先从Model层说起,IModel和IView是顶层接口,只是一个空接口,用作中间层泛型使用:
IModel:
public interface IModel {}
IView:
public interface IView {}
蓝色的中间层接口定义了MVP三层相互调用的接口
MultipleInterfaceContract:
public interface MultipleInterfaceContract {interface View extends IView {String presenterGetDataFromView();}interface Presenter {String viewGetDataFromPresenter(int viewDataIndex);}
}
ISingleInterfaceModel
public interface ISingleInterfaceModel extends IModel {String sendDataFromModelToPresenter(String dataIndex);
}
三层的中间层接口对应的方法全都有最底层的实现类实现
SingleInterfaceActivity
public class SingleInterfaceActivity extends BaseMVPActivity<SingleInterfacePresenter> implements SingleInterfaceContract.View {private Button button;private TextView textView;@Overrideprotected SingleInterfacePresenter createPresenter() {Log.d("MvpDemo", "createPresenter");return new SingleInterfacePresenter();}@Overrideprotected void init() {setContentView(R.layout.activity_single_interface);button = findViewById(R.id.button);textView = findViewById(R.id.textView);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {textView.setText(mPresenter.sendDataFromPresenterToView());}});}@Overridepublic String presenterGetDataFromView() {return "book";}
}
SingleInterfacePresenter
public class SingleInterfacePresenter extends SingleBasePresenter<SingleInterfaceContract.View> implements SingleInterfaceContract.Presenter{private final SingleInterfaceModel singleInterfaceModel;public SingleInterfacePresenter() {this.singleInterfaceModel = new SingleInterfaceModel();}@Overridepublic String sendDataFromPresenterToView() {String dataIndex = mView.presenterGetDataFromView();return singleInterfaceModel.sendDataFromModelToPresenter(dataIndex);}
}
SingleInterfaceModel
public class SingleInterfaceModel implements ISingleInterfaceModel{Map<String, String> hashMap = new HashMap(){{put("book", "this is book in model.");put("pen", "this is pen in model");put("desk", "this is desk in model");}};@Overridepublic String sendDataFromModelToPresenter(String dataIndex) {return hashMap.get(dataIndex);}
}
接下来再介绍中间层,中间层主要作用是建立MVP三层之间的联系,由于V和P层相互持有对方对象,而P和M层之间只有P层单方向持有M层对象,因此M层不需要中间层。
BaseMVPActivity
public abstract class BaseMVPActivity<T extends IPresenter> extends AppCompatActivity implements IView {protected T mPresenter;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);initPresenter();init();}protected void initPresenter() {mPresenter = createPresenter();if (mPresenter != null) {mPresenter.attachView(this);}}@Overrideprotected void onDestroy() {if (mPresenter != null) {mPresenter.detachView();}super.onDestroy();}protected abstract T createPresenter();protected abstract void init();
}
SingleBasePresenter
public abstract class SingleBasePresenter<T extends IView> implements IPresenter<T> {protected T mView;@Overridepublic void attachView(T view) {Log.d("MvpDemo", "attachView");if (view == null) {Log.d("MvpDemo", "mView is null");}mView = view;}@Overridepublic void detachView() {mView = null;}@Overridepublic boolean isViewAttached() {return mView != null;}
}
V和P层都在中间层持有了对方的对象,其中V层通过在实现类中新建P层对象,同时调用P层的attach方法建立双向连接,因此P层需要对应的绑定相关接口来供V层调用,也就是IPresenter
IPresenter
public interface IPresenter<T extends IView> {void attachView(T view);void detachView();boolean isViewAttached();
}
Android Mvp架构详解相关推荐
- Android SystemUI 架构详解
Android SystemUI 架构详解 本文描述Android系统中一个核心应用SystemUI,详细赘述SystemUI中几大模块功能的实现过程.由于作者水平有限,如发现本文中错误的地方,欢迎指 ...
- Android官方MVP架构详解
综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...
- Android MediaRecorder架构详解
1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord.两者的区别如下: (1) MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后 ...
- Android视图架构详解
作者: ztelur 联系方式:segmentfault,csdn,github 转载请注明原作者.文章来源,链接,版权归原文作者所有. 最近一直在研究View的绘制相关的机制,发现需要补充一下An ...
- Android 视图架构详解
转自:http://android.jobbole.com/84519/ Activity,DecorView,PhoneWindow和ViewRoot的作用和相关关系 Android View Ar ...
- 2022最新Android面试题目解答,Android MVP模式详解
开头 Android开发,假如开始没有任何的开发经验的话, 千万不要着急,不要想着在短时间内就把一个语言学习好, 因为你之前没有任何的学习经验, 在这个过程中需要有耐心地学习完JAVA的基础知识, 然 ...
- android vold 加密,android vold架构详解(1)
首先上一张整体的结构类图 VOLD:Volume Daemon存储守护进程,用来为响应Usb/SD卡插入,拔出等动作提供服务. 系统启动时,通过解析init.rc文件来启动各种系统服务. 包括VOLD ...
- google官方mvp+dagger2架构详解
原文链接:http://www.jianshu.com/p/01d3c014b0b1 1 前言 前段时间分享了一篇文章:google官方架构MVP解析与实战 ,针对这是对google官方示例架构的一个 ...
- Android开发入门一之Android应用程序架构详解
Android应用程序架构详解如下: src/ java源代码存放目录 gen/自动生成目录 gen 目录中存放所有由Android开发工具自动生成的文件.目录中最重要的就是R.java文件.这个文件 ...
- Android LiveData组件详解以及LiveDataBus
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/99749323 本文出自[赵彦军的博客] 一.LiveData简介 LiveDat ...
最新文章
- mac安装opencv
- java操作samba_使用Java和Samba JCIFS访问文件
- Rails + React +antd + Redux环境搭建
- java utf8 转换al32utf8_java与Unicode
- c#,xp系统,Matlab6.5
- linux mysql主从配置
- WinAPI: SetTextColor - 设置设备环境的文本颜色
- 如何使用给定的部分名称杀死所有进程?
- stata中计算公式命令_Stata:runby - 一切皆可分组计算!
- html javascript 表格id,javascript 获取表格中元素id的实现代码
- 如何使用小米手机的便签功能
- 原型图与Axure基础
- mysql case when in_MySQL case when 使用
- VSCode 中怎样快速切换多个项目
- dlink 备份文件_D-Link路由器备份路由器配置信息教程
- 遥感数据在植物识别的应用
- leetcode 1313. Decompress Run-Length Encoded List(python)
- STM32F1XX的GPIO的8种工作模式以及GPIO的寄存器简介
- 豆瓣 9.3 的高分,牛逼的 Git!
- Maltego 版本类型重新选择
热门文章
- C51单片机串口通信之上位机交互
- 基于移动互联网的交互式卫星地面管理终端
- Fences 2.1 - 高效实用的桌面图标栅栏分类管理软件神器 (桌面图标再多也不会乱)
- 分享一个WIN10可用的桌面图标栅栏管理插件Fences的破解版
- 虚拟偶像发展史:TA们到底如何成功?万字复盘
- mysql emoji表情_mysql utf8mb4与emoji表情
- 使用bus hound发送包的方法
- V360i手机相关软件全面介绍(附下载)
- 遥感原理与应用总结——第五章:遥感图像几何处理
- IntelliJ IDEA下载 与 破解(Evaluate for free 灰色)