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. ...
随机推荐
- spring中ApplicationContextAware接口描述
项目中使用了大量的工厂类,采用了简单工厂模式: 通过该工厂类可以获取指定的处理器bean,这些处理器bean我们是从spring容器中获取的,如何获取,是通过实现ApplicationContextA ...
- TypeScript 与 es6 写法的区别
import 方式 ts 默认对于 commonjs 的模块是这样加载的:import * as React from 'react'; es6:import React from 'react'; ...
- mysql 不允许分组的问题
异常信息:this is incompatible with sql_mode=only_full_group_by 解决办法: 找到 my.cnf find / -name my.cnf 然后在 ...
- yaml,json,ini这三种格式用来做配置文件优缺点
适合人类编写:ini > toml > yaml > json > xml > plist可以存储的数据复杂度:xml > yaml > toml ~ jso ...
- cvsnt报错:Administrator: Switch to user failed due to configuration error. Contact your System Administrator
在安装CVSNT一开始用Administrator登录时总是报[login aborted]Switch to user failed due to configuration error. Cont ...
- NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但 ...
- 使用POP3协议接收并解析电子邮件(全)
package org.yangxin.study.jm; import java.io.BufferedInputStream; import java.io.BufferedOutputStrea ...
- Linux常用命令之定时任务
定时任务的实现,可以让我们把很多重复的,有规律的事情交给机器做.我们就不用苦逼的烦躁做同一件事,这样也让我们做程序的有更多的乐趣和价值.用技术的手段解决常人花时间精力解决的问题.在Linux下实现定时 ...
- js 实现滚动字幕
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- AS3面试题 个人理解
现在as3面试 感觉就那几个题目来回考.有了题库,大家都看了 都答上来了 题目本身也就失去了考核的意义.而且题目本身也有很多偏的(不常用的)在考. 真正的面试官现在肯定也不会把笔试成绩当作标准.所谓: ...