MVP简介

相信你们对 MVC 都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP做为MVC的演化版本,也是做为用户界面(用户层)的实现模式,那么相似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。html

Model

Model 是用户界面须要显示数据的抽象,也能够理解为从业务数据(结果)那里到用户界面的抽象。android

View

视图这一层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体如今了这一层,Activity通常也就作加载UI视图、设置监听再交由Presenter处理的一些工做,因此也就须要持有相应Presenter的引用。git

Presenter

Presenter这一层处理着程序各类逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由业务层作具体的业务操做,而后将获得的 Model 给 View 显示。github

MVC和MVP的区别网络

在 MVC 中:架构

View 能够与 Model 直接交互;

Controller 能够被多个 View 共享;

Controller 能够决定显示哪一个 View 。

在 MVP 中:ide

View 不直接与 Model 交互;

Presenter 与 View 经过接口来交互,更有利于添加单元测试;

一般 View 与 Presenter 是一对一的,但复杂的 View 可能绑定多个 Presenter 来处理;

Presenter 也能够直接进行 View 上的渲染。

模仿登陆案例:(demo中包含登陆和网络数据请求)单元测试

model

public class ModelSignIn implements ILoginSignIn {

@Override

public void onSignIn(String name, String pwd, IOnSetListenter listenter) {

if (name.isEmpty())

{

if (listenter!=null)

{

listenter.onError("输入用户名为空");

return;

}

}

if (pwd.isEmpty())

{

if (listenter!=null)

{

listenter.onError("输入密码为空");

return;

}

}

if(name.equals("dickyqie") && pwd.equals("123456"))

{

if (listenter!=null)

{

listenter.onError("登陆成功");

return;

}

}else{

if (listenter!=null)

{

listenter.onError("登陆失败");

return;

}

}

}

}

presenter

public class Presenter extends BasePresenter {

ILoginSignIn iLoginSignIn=new ModelSignIn();

public void setSignIn(String name,String pwd)

{

iLoginSignIn.onSignIn(name, pwd, new ILoginSignIn.IOnSetListenter() {

IView view=getView();

@Override

public void onError(String error) {

if(view!=null){

view.showToast(error);

}

}

@Override

public void onSccess(String repsonce) {

if(view!=null){

view.showToast(repsonce);

}

}

});

}

}

activity

public class MainActivity extends BaseActivity implements IView,View.OnClickListener{

EditText username;

EditText password;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView()

{

username=(EditText)findViewById(R.id.username);

password=(EditText)findViewById(R.id.password);

findViewById(R.id.login).setOnClickListener(this);

}

@Override

public Presenter createPersenter() {

return new Presenter();

}

@Override

public void onClick(View v) {

String name=username.getText().toString();

String pwd=password.getText().toString();

p.setSignIn(name,pwd);

}

@Override

public void showToast(String msg) {

Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show();

}

}

网络请求

public class MainActivity extends BaseActivity implements IView,View.OnClickListener {

private TextView textView;

private ProgessDialog dialog;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView(){

textView=(TextView) findViewById(R.id.text);

findViewById(R.id.btn).setOnClickListener(this);

}

@Override

public void onLoadContributorStart() {

showProgress();

}

@Override

public void onLoadContribtorComplete(String topContributor) {

//获得主线程的数据

Message msg=new Message();

msg.what=1;

msg.obj=topContributor;

handler.sendMessage(msg);

}

Handler handler=new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

dismissProgress();

textView.setText(msg.obj.toString());

}

};

@Override

public void onClick(View v) {

p.setGet();

}

@Override

public Presenter createPresenter() {

return new Presenter();

}

@Override

public void onNetWork() {

Toast.makeText(getApplicationContext(),"网络未链接",Toast.LENGTH_LONG).show();

}

@Override

public void onError() {

Toast.makeText(getApplicationContext(),"数据加载失败",Toast.LENGTH_LONG).show();

textView.setText("");

}

/***

* 启动

*/

public void showProgress()

{

if(dialog==null)

{

dialog=new ProgessDialog(MainActivity.this);

}

dialog.showMessage("正在加载");

}

/***

* 关闭

*/

public void dismissProgress()

{

if(dialog==null)

{

dialog=new ProgessDialog(this);

}

dialog.dismiss();

}

}

不要忘记在AndroidManifest.xml加权限哦!

因为代码太多,完整代码未给出,源码直接下载便可

android MVP连接服务器,Android之MVP模式实现登陆和网络数据加载相关推荐

  1. android 仿快递步骤_Android实现仿美团、顺丰快递数据加载效果

    我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation).帧动画是提供了一种逐帧播放图片的动画方式,播放事先 ...

  2. 红米note8pro微信无法连接服务器,在红米Note8Pro微信浏览网页background-image图片无法加载?...

    在红米Note8Pro微信内置浏览器打开网页,background-image属性无效,图片无法加载. 情形一 html xxxxxxbody> cssbody {background-imag ...

  3. 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载...

    ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...

  4. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  6. android 请求大量数据处理,Android大量数据加载—Paging的使用

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Paging主要是用来结合RecyclerView进行使用的.它的作用是能够逐渐地.优雅地加载所需要加载的数据.也就是一 ...

  7. android 之ListView分页效果以及从网络上加载数据一系列的综合运用

    数据分页策略: <1>:用多少查多少 <2>:全部查询出来,再进行分页处理 数据分页的有关算法: (1):起始索引值 = (当前页-1)*每页显示的记录数 (2):结束索引值 ...

  8. android loader使用教程,Android Loader 机制,让你的数据加载更加轻松

    前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现.其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1.Thread + Hand ...

  9. android Launcher——数据加载与变更

    在前面我的blog中,我已经说过了,Launcher所有的桌面项数据是存储在launcher.db/favorites表中 在Launcher启动时loadeworkspace函数中会从数据库中查询所 ...

最新文章

  1. 数据库连接客户端使用(db2,oracle,mysql)
  2. Mysql数据库存储引擎--转
  3. rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
  4. 【C语言】switch中无break的情况
  5. Linux中常用的查找文件的命令
  6. python判断两线段是否相交_c语言 判断两直线段是否相交
  7. Spring MVC自定义验证注释
  8. 使用lua实现nginx rewrite
  9. mysql 配置详解
  10. SAP License:四类业务四类工厂
  11. AnyChat视频直播系统全面分析
  12. Linux内核的学习(二)
  13. Representation Learning 表示学习(简单笔记)
  14. 十大开源Web应用安全测试工具
  15. VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
  16. Hwclock用法介绍
  17. Jzoj4896 兔子
  18. 长春工业大学计算机研究生专业课,长春工业大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  19. 融云--快速集成融云
  20. python高斯噪声怎么去除_Python图像处理之Pillow--ImageFilter介绍

热门文章

  1. java获取屏幕截图
  2. c#zip压缩解压缩全解
  3. 555定时器的应用——施密特触发器
  4. Xcode中的iOS工程模板
  5. Hibernate占位符?和:及JPA
  6. 事务背书 ACID, CAP, BASE
  7. 第6次结对作业--郑锦伟古维城
  8. 黑白染色——封锁阳光大学
  9. Java学习笔记——JDBC读取properties属性文件
  10. 容易忽视但是功能灰常强大的Java API(二. 读写对象)