就一个十分简单的获取列表数据并展示的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案例;的更多相关文章

  1. Android 最简单的MVP案例;

    随手撸个发出来: V:界面层 //界面层需要实现P.View方法,然后重写P.View中的方法:M层给的数据就在这些个方法的参数中: // 还要获取到P.Provide的实例,使用P.Provide去 ...

  2. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  3. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  4. [Android]Android MVP&依赖注入&单元测试

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...

  5. Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化

    Android MVP粗来已经有段时间了,在项目中我也多多少少用了一些,不得不说代码使用这种模式后,条例确实清晰了好多,整个流程看起来有点各司其职的感觉(另一种的java面向对象的方式). 不过这里是 ...

  6. Android MVP模式

    转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...

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

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200

  8. 结合实例分析Android MVP的实现

    最近阅读项目的源码,发现项目中有MVP的痕迹,但是自己却不能很好地理解相关的代码实现逻辑.主要原因是自己对于MVP的理解过于概念话,还没有真正操作过.本文打算分析一个MVP的简单实例,帮助自己更好的理 ...

  9. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

随机推荐

  1. pri 知识点

    pri github:https://github.com/prijs/pri 添加路由后动态导入,使用的是 react-loadable:https://github.com/jamiebuilds ...

  2. python多线程、多进程相关知识

    Queue Queue用于建立和操作队列,常和threading类一起用来建立一个简单的线程队列. 首先,队列有很多种,根据进出顺序来分类,可以分成 Queue.Queue(maxsize) FIFO ...

  3. thinkphp5 列表页数据分页查询3-带搜索条件

    先加载模板然后在前端HTML页面请求数据 /** * 加载列表页模板 * @author 冯广福 */ public function index() { LogWriteService::write ...

  4. ulimit设置内存限制是否有效

    如何使用ulimit限制物理内存 限制物理内存 $ ulimit -m 512000 经测试,无效. 限制物理内存不起作用,ulimit不支持限制物理内存,可见man ulimit手册 -m The ...

  5. Go sql insert update使用举例

    本文结合使用场景简单介绍sql中的insert.update的使用. 以下是代码: 如果记录已经存在,则更新,否则插入新记录. package main import ( "database ...

  6. Python 基础语法+简单地爬取百度贴吧内容

    Python笔记 1.Python3和Pycharm2018的安装 2.Python3基础语法 2.1.1.数据类型 2.1.1.1.数据类型:数字(整数和浮点数) 整数:int类型 浮点数:floa ...

  7. Hadoop HDFS的shell(命令行客户端)操作实例

    HDFS的shell(命令行客户端)操作实例 3.2 常用命令参数介绍 -help 功能:输出这个命令参数手册 -ls                  功能:显示目录信息 示例: hadoop fs ...

  8. c#程序退出

    Environment.Exit(0); Process.GetCurrentProcess().Kill();

  9. Observable讲解

    参见这里 总结: Observable是传统观察者+链式模式的函数式实现 Observable官方文档 还是比较喜欢EventBus,简单粗暴,angular-event-service可支持angu ...

  10. 黄聪:bootstrap中模态框modal在苹果手机上会失效

    bootstrap中模态框在苹果手机上会失效 可将代码修改为<a  data-toggle="modal" data-target="#wrap" hre ...