就一个十分简单的获取列表数据并展示的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. Delphi Json之树遍历

    procedure TForm1.VisitDirJsonTree(const AJsonObj: ISuperObject); var i: Integer; oItem: TSuperAvlEnt ...

  2. webpack 3 升级到 webpack 4,遇到问题解决

    报错:Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead 解 ...

  3. ps 和 top 的cpu的区别

    cpu的计算 ps cpu的定义 man page中给出的定义: cpu utilization of the process in "##.#" format. Currentl ...

  4. mongodb morphia删除数组中指定条件的数据

    先看mongodb操作: db.test.update({"msgid":170},{"$pull":{"msg":{"comti ...

  5. MySQL数据库分区操作【RANGE】

    客服平台,线上查询存在性能问题,为了解决或者说是缓解这个问题,除了加必要的索引,另外就是将表进行分区. 这里主要是针对既有的表进行分区,采用的是alter table xxx的方式,当然,也可以采用c ...

  6. Php文件上传类class.upload.php

    简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮助你快速的给自己的网站集成上传文件功能.不仅如此,此分类还有一些列的处理功能,可以对上传的文件或者本地的文件进行处 ...

  7. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...

  8. msp430学习笔记-实现开方log等计算及FFT算法(待续)

    MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...

  9. Python Flask 构建微电影视频网站

    前言 学完本教程,你将掌握: 1.学会使用整形.浮点型.路径型.字符串型正则表达式路由转化器 2.学会使用post与get请求.上传文件.cookie获取与相应.404处理 3.学会适应模板自动转义. ...

  10. Gradle详细解析***

    前言 对于Android工程师来说编译/打包等问题立即就成痛点了.一个APP有多个版本,Release版.Debug版.Test版.甚至针对不同APP Store都有不同的版本.在以前ROM的环境下, ...