Android MVP案例;
就一个十分简单的获取列表数据并展示的Demo;分别使用MVC和MVP实现;
先来一个假的数据源:
//假设这就是数据源
public class UserBean {
public static List<String> datas = Arrays.asList("CCB","JY","YHL","ZQ","ZJH","XSN");
}
MVC模式:
public class CActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_c);
TextView tv = findViewById(R.id.tv);
List<String> datas = UserBean.datas;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i <datas.size() ; i++) {
stringBuilder.append("\n"+datas.get(i));
}
tv.setText(stringBuilder);
}
}
完成,十分的简单;
如果业务逻辑比较简单,没有必要使用MVP模式。MVP模式的优点就是解耦性强,让界面只专注UI的处理,跟Android API无关的业务逻辑由 Presenter 层来完成;
好了,接下来是MVP模式了:认真学认真看;
首先定义一个UserContract类,它是V和P的中间层,也是M给P反馈信息的载体;
public interface UserContract {
/**
* View接口是Activity(Fragment)与Presenter层的中间层,它的作用是根据具体业务的需要,
* 为Presenter提供调用Activity中具体UI逻辑操作的方法
*/
interface View extends BaseView<Presenter>{
void showText(List<String> datas);
}
/**
* Presenter接口是Model层给Presenter层反馈请求信息的传递载体,
* 所以需要在Presenter中定义数据请求的各种反馈状态:
*/
interface Presenter extends BasePresenter{
void setData();
void login();
}
}
通用的方法定义两个基类,写在基类中:
public interface BaseView<T> {
void setPresenter(@NonNull T presenter);
void showDialog();
void dissmisDialog();
void onError();
}
public interface BasePresenter {
void start();
}
接下来是UserPresenter类,它就是P层;
public class UserPresenter implements UserContract.Presenter{
/**
* UserPresenter类是具体的逻辑业务处理类,负责请求数据,并对数据请求的反馈进行处理。
UserPresenter类的构造方法中有一个View接口的参数,是为了能够通过View接口通知Activity进行更新界面等操作。
*/
private UserContract.View v;
public UserPresenter(UserContract.View v){
this.v = v;
this.v.setPresenter(this);
}
@Override
public void start() {
v.showText(UserBean.datas);
}
@Override
public void setData() {
}
@Override
public void login() {
}
}
V层:Activity:
/**
* 调用UserPresenter就要先实现Presenter需要的对应的View接口
*/
public class PActivity extends AppCompatActivity implements UserContract.View{ private TextView tv;
private UserContract.Presenter presenter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_c);
tv = findViewById(R.id.tv);
new UserPresenter(this);
presenter.start();
} @Override
public void showText(List<String> datas) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i <datas.size() ; i++) {
stringBuilder.append("\n"+datas.get(i));
}
tv.setText(stringBuilder);
} @Override
public void setPresenter(@NonNull UserContract.Presenter presenter) {
this.presenter = presenter;
} @Override
public void showDialog() { } @Override
public void dissmisDialog() { } @Override
public void onError() { }
}
Android MVP案例;的更多相关文章
- Android 最简单的MVP案例;
随手撸个发出来: V:界面层 //界面层需要实现P.View方法,然后重写P.View中的方法:M层给的数据就在这些个方法的参数中: // 还要获取到P.Provide的实例,使用P.Provide去 ...
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- 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模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- 结合实例分析Android MVP的实现
最近阅读项目的源码,发现项目中有MVP的痕迹,但是自己却不能很好地理解相关的代码实现逻辑.主要原因是自己对于MVP的理解过于概念话,还没有真正操作过.本文打算分析一个MVP的简单实例,帮助自己更好的理 ...
- android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】
android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...
随机推荐
- redis之 Redis持久化配置
Redis持久化配置 Redis的持久化有2种方式 1快照 2是日志 Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 ...
- .net 读取/保存 文件 到 局域网 服务器
public class IdentityScope : IDisposable { /// <summary> /// 登录一个新用户 /// </summary> /// ...
- LNMP, CentOS7.0+Nginx+Mysql5.7+PHP7环境安装
LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.这里和家分享一下,如何在CentOS 7.0上搭建一个这样的环境,其中软件使用yum方式安装. 进入CentOS ...
- 使用Vivado的block design
使用Vivado的block design (1)调用ZYNQ7 Processing System (2)配置ZYNQ7系统 (3)外设端口配置 根据开发板原理图MIO48和MIO49配置成了串口通 ...
- sqlalchemy操作----外键关联,relationship
... #!_*_coding:utf-8_*_ #__author__:"Alex huang" import sqlalchemy from sqlalchemy import ...
- elasticsearch mysql logstash 同步 简单配置【环境centos7 elasticsearch 6.0 mysql 5.7 logstash 6.0】
插件:logstash-input-jdbc 安装插件logstash-input-jdbc 1.安装 gem yum install gem 2.替换国内的镜像 gem sources -- ...
- oracle--分组后获取每组数据第一条数据
SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY cc.queuename ORDER BY cc.enroldate DESC) rn, cc ...
- windows安装mysql数据库并修改密码
1.下载 MySQL Community Server https://dev.mysql.com/downloads/mysql/ 2.解压 如果想要让MySQL安装在指定目录,那么就将解压后的文件 ...
- java.util.ConcurrentModificationException的解决办法
今天在使用iterator.hasNext()操作迭代器的时候,当迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 编译器报出了以下异常: Exception in thread " ...
- Sublime Text 3中文乱码问题解决(最新)
Sublime Text 3是我MacBook Pro最喜欢的代码编辑器,没有之一,因为她的性感高亮代码配色,更因为它的小巧,但是它默认不支持GBK的编码格式,因此打开GBK的代码文件,如果里面有中文 ...