广告
返回顶部
首页 > 资讯 > 移动开发 >详解Android中的MVP架构分解和实现
  • 382
分享到

详解Android中的MVP架构分解和实现

Android 2022-06-06 04:06:42 382人浏览 八月长安
摘要

1、概述 传统的Android开发架构一般是mvc模式, Model:业务逻辑和实体模型 View:对应于布局文件 Controllor:对应于Activity 单

1、概述

传统的Android开发架构一般是mvc模式,

Model:业务逻辑和实体模型 View:对应于布局文件 Controllor:对应于Activity

单独从逻辑看起来非常好,与我们做web开发时,开发模式类似,但在实际开发中,View对应于布局文件,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,Activity既像View又像Controller(MVVP架构中包括数据绑定),导致Activity中职责太重,耦合度大。修改和维护起来非常麻烦。

这里写图片描述

2、MVP介绍

这里写图片描述

MVP架构中,View 对应于Activity,负责View的绘制以及与用户交互

Model 依然是业务逻辑和实体模型,Presenter 负责完成View于Model间的交互。

(1)Model层

模型层之中做的工作是具体业务逻辑处理的实现,都伴随着程序中各种数据的处理,复杂一些的就需要实现一个Interface来松耦合了。

(2)View层

视图层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体现在了这一 层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。处理一些基本UI逻辑,判断是否为空。

(3)Presenter层

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

MVP架构和MVC架构区别:

这里写图片描述

MVC中是允许Model和View进行交互的,而MVP中,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的。

3、MVP实现

百说不如一做。实现一个简单的登录操作。

项目结构如下:

这里写图片描述

(1)Model层实现

首先实现User实体类:


package com.chunsoft.bloGContent.bean;

public class User {
 private String username;
 private String passWord;
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
}

model层主要实现业务逻辑处理,在本文案例中,主要逻辑处理就是登录,抽取了一个接口和一个实现类,在login操作,模拟登录操作,Thread.sleep()模拟耗时,由于是耗时操作,通过一个回调接口通知登录状态。

model层接口:


package com.chunsoft.blogcontent.model;
import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;

public interface LoginModel {
 void login(String username, String password, RequestCallback<User> callback);
}

model层接口实现:


package com.chunsoft.blogcontent.model.impl;
import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.model.LoginModel;

public class LoginModelImpl implements LoginModel{
 @Override
 public void login(final String username, final String password, final RequestCallback<User> callback) {
  //模仿登录操作
  new Thread() {
   @Override
   public void run() {
    try {
     Thread.sleep(2*1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    if ("chunsoft".equals(username) && "123456".equals(password)) {
     User user = new User();
     user.setUsername(username);
     user.setPassword(password);
     callback.onSuccess(user);
    } else {
     callback.onFailure("登录失败");
    }
   }
  }.start();
 }
}

回调接口:


package com.chunsoft.blogcontent;

public interface RequestCallback<T> {
 void onSuccess(T datas);
 void onFailure(String msg);
}

(2)View层实现

对于View层接口定义,首先考虑功能上的操作,然后考虑:

该操作需要什么?(getUserName等) 该操作的结果,对应的反馈?(toMainActivity等) 该操作过程中交互友好?( showLoading)

view层接口:


package com.chunsoft.blogcontent.view;
import com.chunsoft.blogcontent.bean.User;

public interface LoginView {
 String getUserName();
 String getPassword();
 void showLoading();
 void hideLoading();
 void toMainActvity(User user);
 void showFailedError(String msg);
}

view层实现,其实就是Activity,可以看到Activity的代码量大大减少,且逻辑清晰:


package com.chunsoft.blogcontent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.presenter.impl.LoginPresenterImpl;
import com.chunsoft.blogcontent.view.LoginView;
public class MainActivity extends AppCompatActivity implements LoginView{
 private EditText et_mobile,et_password;
 private ProgressBar pb;
 private Button btn_login;
 private LoginPresenterImpl mLoginPresenter = new LoginPresenterImpl(this);
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  et_mobile = (EditText) findViewById(R.id.et_mobile);
  et_password = (EditText) findViewById(R.id.et_password);
  pb = (ProgressBar) findViewById(R.id.pb);
  btn_login = (Button) findViewById(R.id.btn_login);
  btn_login.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    mLoginPresenter.login();
   }
  });
 }
 @Override
 public String getUserName() {
  return et_mobile.getText().toString();
 }
 @Override
 public String getPassword() {
  return et_password.getText().toString();
 }
 @Override
 public void showLoading() {
  pb.setVisibility(View.VISIBLE);
 }
 @Override
 public void hideLoading() {
  pb.setVisibility(View.INVISIBLE);
 }
 @Override
 public void toMainActvity(User user) {
  Toast.makeText(this,user.getUsername() + "登录成功",Toast.LENGTH_SHORT).show();
 }
 @Override
 public void showFailedError(String msg) {
  Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
 }
}

(3)Presenter层实现

Presenter层是Model层和View层的桥梁,本文中依然抽象出一个接口和一个实现类,定义时主要看该功能有什么操作,例如,登录:

Presenter接口:


package com.chunsoft.blogcontent.presenter;

public interface LoginPresenter {
  void login();
}

Presenter层实现:


package com.chunsoft.blogcontent.presenter.impl;
import android.os.Handler;
import com.chunsoft.blogcontent.RequestCallback;
import com.chunsoft.blogcontent.bean.User;
import com.chunsoft.blogcontent.model.LoginModel;
import com.chunsoft.blogcontent.model.impl.LoginModelImpl;
import com.chunsoft.blogcontent.presenter.LoginPresenter;
import com.chunsoft.blogcontent.view.LoginView;

public class LoginPresenterImpl implements LoginPresenter {
 private LoginView loginView;
 private LoginModel loginModel;
 private Handler mHandler = new Handler();
 //在构造函数中初始化
 public LoginPresenterImpl(LoginView loginView) {
  this.loginModel = new LoginModelImpl();
  this.loginView = loginView;
 }
 @Override
 public void login() {
  loginView.showLoading();
  loginModel.login(loginView.getUserName(), loginView.getPassword(), new RequestCallback<User>() {
   @Override
   public void onSuccess(final User datas) {
    //登录成功
    mHandler.post(new Runnable() {
     @Override
     public void run() {
      loginView.toMainActvity(datas);
      loginView.hideLoading();
     }
    });
   }
   @Override
   public void onFailure(final String msg) {
    //登录失败
    mHandler.post(new Runnable() {
     @Override
     public void run() {
      loginView.showFailedError(msg);
      loginView.hideLoading();
     }
    });
   }
  });
 }
}

Presenter层是Model层和View层的桥梁,Model层和View层不直接通信,所以Presenter层需要Model层和View层的实现类,从View层中获取重要参数,交给Model 层调用业务逻辑处理,执行后的结果和反馈再交给View层去展示。

本文源码下载

本文是简单的用MVP架构实现登录操作,而目前主流开发,将Rxjava、Retrofit和MVP结合进行开发,逻辑更加清晰,下篇文章将详细介绍这部分实现。

您可能感兴趣的文章:浅谈Android官方MVP架构解读Android登录代码MVP架构详解


--结束END--

本文标题: 详解Android中的MVP架构分解和实现

本文链接: https://www.lsjlt.com/news/22357.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Android中的MVP架构分解和实现
    1、概述 传统的Android开发架构一般是MVC模式, Model:业务逻辑和实体模型 View:对应于布局文件 Controllor:对应于Activity 单...
    99+
    2022-06-06
    Android
  • 如何Android项目中实现一个MVP架构
    这期内容当中小编将会给大家带来有关如何Android项目中实现一个MVP架构,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、概述传统的Android开发架构一般是MVC模式,Model:业务逻辑和实体模...
    99+
    2023-05-31
    android mvp roi
  • 详解Android官方架构中UseCase
    目录1. UseCase 的用途2. UseCase 的特点2.1 不持有状态2.2 单一职责2.3 可有可无3. 如何定义 UseCase3.1 Optional or Manda...
    99+
    2023-05-19
    Android官方架构UseCase Android官方架构
  • Android MVVM架构实现RecyclerView列表详解流程
    目录效果图导入引用导入Recyclerview依赖导入dataBinding引用代码解析建立实体类建立RecyclerView子项适配器建立适配器设置子项点击事件adapter全部代...
    99+
    2022-11-12
  • 详解MVP模式在Android开发中的应用
    一、MVP介绍  随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的...
    99+
    2022-06-06
    mvp模式 android开发 Android
  • Android实现MVVM架构数据刷新详解流程
    目录效果图示例结构图代码解析导入dataBinding实体类xml视图VM绑定视图与数据层效果图 示例结构图 代码解析 导入dataBinding dataBinding{...
    99+
    2022-11-12
  • Android的搜索框架实例详解
    基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面。所有的这些工作都由S...
    99+
    2022-06-06
    框架 Android
  • 详解mysql集群:一主多从架构实现
    实验环境: 1、三台CentOS 7 服务器 2、mysql5.7.26(三台都通过yum安装) 服务器列表 7.100.222.111 master ...
    99+
    2022-10-18
  • python http服务flask架构实用代码详解分析
    依赖库 flask安装,使用豆瓣源加速。 pip install flask -i https://pypi.douban.com/simple gevent安装,使用豆瓣源加...
    99+
    2022-11-12
  • 详解Android中Handler的实现原理
    在 Android 中,只有主线程才能操作 UI,但是主线程不能进行耗时操作,否则会阻塞线程,产生 ANR 异常,所以常常把耗时操作放到其它子线程进行。如果在子线程中需要更新 ...
    99+
    2022-06-06
    handler Android
  • 阿里云服务器的分布式架构详解
    阿里云服务器是阿里云为用户提供的一系列云服务器产品,涵盖了多种计算和存储资源。其中,分布式架构是阿里云服务器的重要特性之一,它可以帮助用户更高效地管理和利用计算资源。本文将详细介绍阿里云服务器的分布式架构,包括它的基本概念、实现方式以及优势...
    99+
    2023-11-02
    阿里 分布式 详解
  • 详解android在mob平台实现qq登陆和分享
    个人感觉mob平台功能还是比较强大的,很多功能都可以通过他们平台来实现。 建议仔细观看每一个步骤,如果一个步骤没处理好,可能就会让你的这个功能无法实现。相信我一定可以成功的。 废话少...
    99+
    2022-11-12
  • Golang与RabbitMQ实现微服务架构中的消息解耦和解藕
    在微服务架构中,消息解耦和解藕是非常重要的概念。它们可以帮助不同的微服务之间实现解耦,降低彼此的依赖性,并提高系统的扩展性和可维护性...
    99+
    2023-10-20
    Golang
  • Android源码中的目录结构详解
    Android 2.1 |-- Makefile |-- bionic         ...
    99+
    2022-06-06
    Android
  • Android中的Dalvik和ART详解及区别分析
    要想知道Dalvik和ART区别分析,首先我们要分别知道这两者是什么? 什么是Dalvik? Dalvik是Google公司自己设计用于Android平台的虚拟机。 Dalvi...
    99+
    2022-06-06
    art Android
  • Android中巧妙的实现缓存详解
    前言 缓存有很多的实现方式,技巧性还有坑都很多,今天我给大家介绍一些非通用的方法,可以巧妙地帮大家简单实现一些内存缓存。 Supplier和Memoize SQLite是An...
    99+
    2022-06-06
    缓存 Android
  • php中的分布式架构怎么理解
    这篇“php中的分布式架构怎么理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php中的分布式架构怎么理解”文章吧。在PH...
    99+
    2023-06-29
  • 详解Android首选项框架的使用实例
    首选项这个名词对于熟悉Android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数。 Android提供了一种健壮并且灵活的框架来处理首选项。它提供了简单的API来隐...
    99+
    2022-06-06
    框架 Android
  • Android中Fragment的解析和使用详解
    前言 Android Fragment的生命周期和Activity类似,实际可能会涉及到数据传递,onSaveInstanceState的状态保存,FragmentManage...
    99+
    2022-06-06
    fragment Android
  • 详解Android中实现热更新的原理
    这篇文章就来介绍一下Android中实现热更新的原理。 一、ClassLoader 我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoad...
    99+
    2022-06-06
    更新 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作