Android快速生成MVP 模式代码

Android项目源码一款阅读类App MVP + RxJava + Retrofit 立即下载

前言

2018年年底的互联网寒冬比我想象的更加寒冷,从12月份离职后接了两个私活,到今年19年3月份项目彻底结算完,然后开始找工作,持续到现在还没有找到合适的工作。因为Android 我全靠自学出来的,野路子出身,有很多先天性的不足,这段时间的待业状态也让自己系统的过了一遍Android以及JAVA 方面的知识点。期间也一直没有写过博客,打算把这段时间的整理及心得整理到博客上来。好了,废话不多说,我们直接上干货。MVC,MVP,MVVM这三个我们都或多或少的听说过或者了解过,但说实话,我在上家公司做Android的时候只对代码根据功能进行过模块化的拆分,具体在项目中或在代码中很少有实现,下面我们先简单的介绍下这三种模式。

MVC、MVP和MVVM

一、MVC、MVP和MVVM 都分别是什么?

MVC:模型(Model)、视图(View)和控制器(Controller)
  • 模型(Model):专门用来处理业务逻辑,如数据库相关的操作、文件的访问和数据结构等。
  • 视图(View): 专注页面布局和数据显示,如界面的显示
  • 控制器(Controller):连接模型和视图,如把视图的请求发送给模型
    在这里插入图片描述
    MVC实现了视图和模型的分离,避免了视图和模型糅合在一起,当视图改变的时候只要业务逻辑没变不需要改变模型;但是它有一个缺点缺点是因为MVC中的控制器并不能直接更新视图,所以MVC并不能实现视图和模型的完全分离,视图依然依赖模型的数据(数据结构)来显示,也就是说视图依赖模型。
MVP: 模型(Model)、视图(View)和展示器(Presenter)
  • 模型(Model):专门用来处理业务逻辑,如数据库相关的操作、文件的访问和数据结构等。
  • 视图(View):专注页面布局和数据显示,如界面的显示
  • 展示器(Presenter):连接模型和视图,处理视图的请求并根据模型更新视图,将模型和视图进行分离了,所有的交互都发生在Persenter 内部。
    在这里插入图片描述
    MVP用展示器代替了控制器,而展示器是可以直接更新视图,所以MVP中展示器可以处理视图的请求并递送到模型又可以根据模型的变化更新视图,实现了视图和模型的完全分离。
MVVM:模型(Model)、视图(View)和视图模型(ViewModel)
  • 模型(Model):专门用来处理业务逻辑,如数据库相关的操作、文件的访问和数据结构等。
  • 视图(View):专注页面布局和数据显示,如界面的显示
  • 视图模型(ViewModel):连接模型和视图,也是将模型和视图进行了分离,但视图模型和视图是双向绑定的,当视图发生变化的时候视图模型也会发生改变,当视图模型变化的时候视图也随之变化。
    在这里插入图片描述
    MVVM用视图模型代替了MVP中的展示器,视图模型和视图实现了双向绑定,当视图发生变化的时候视图模型也会发生改变,当视图模型变化的时候视图也随之变化。

二、个人建议在Android中采用MVP

MVP相比于MVC的优势:

  • 分离了视图逻辑和业务逻辑,降低了耦合。
  • Activity只处理生命周期的任务,代码变得更加简洁。
  • 视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性。
  • Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试。
  • 把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM。

大家也可以看一看任玉刚大大的MVC、MVP、MVVM,我到底该怎么选?这篇文章,可以根据项目中不同的情况下可以采用的不同的模式。

Android快速生成MVP 模式代码

Demo 小例子:通过MVP模式实现登录效果,效果看下图:
在这里插入图片描述

一、安装MVPHelper插件

MVPHelper是一款适用于 Intellij IDEA 和 Android Studio 的插件, 可用于为 MVP 架构生成接口以及实现类。在 Android Studio 中Setting 窗口的 Plugins选项搜索 MVPHelper 安装即可,具体可看下图。
在这里插入图片描述

二、使用MVPHelper 快速创建MVP

首先在包下创建一个 presenter 空文件夹,然后创建一个LoginPresenter 的类,在类中使用MVPHelper 插件生成接口以及实现类。具体看下图:
在这里插入图片描述

创建成功后会生成如下目录结构:
在这里插入图片描述

三、根据生成的MVP目录结构去拆分登录这个过程
1、首先是界面xml布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/edtTxt_login_account"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:hint="请输入账号"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/edtTxt_login_password"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:hint="请输入密码"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_login_login"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:text="登陆"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
2、对MVP模型拆分逻辑,实现LoginContract 接口
public interface LoginContract {

    // 模型 处理数据
    interface Model {
        void login(String name, String psw, LoginPresenter loginPresenter);
    }

    // 视图  显示界面
    interface View {
        // 登录失败
        void onFail(String msg);
        // 登录成功
        void onSuccess();
        // 获取账号
        String getName();
        // 获取密码
        String getPassWord();
    }

    // 展示器 或者说 主持人  进行逻辑处理
    interface Presenter {
        // 登陆成功
        void onSuccess();
        // 登陆失败
        void onFail(String msg);
    }
}
3、对接口进行实现
  • Model 模型的实现
public class LoginModel implements LoginContract.Model {

    @Override
    public void login(String name, String psw, LoginPresenter loginPresenter) {
        /**
         * 对数据做一个简单的判断 并通知展示器
         */
        if (name.isEmpty() || psw.isEmpty()){
            loginPresenter.onFail("账号密码不能为空");
        }else if (name.equals("root") && psw.equals("123456")){
            loginPresenter.onSuccess();
        }else {
            loginPresenter.onFail("账号密码错误");
        }
    }
}
  • View 视图的实现
public class LoginActivity extends AppCompatActivity implements LoginContract.View, View.OnClickListener {

    private EditText edtTxtLoginAccount;
    private EditText edtTxtLoginPassword;
    private Button btnLogin;
    private LoginPresenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        edtTxtLoginAccount = findViewById(R.id.edtTxt_login_account);
        edtTxtLoginPassword = findViewById(R.id.edtTxt_login_password);
        btnLogin = findViewById(R.id.btn_login_login);
        btnLogin.setOnClickListener(this);
        loginPresenter=new LoginPresenter(this);
    }

    @Override
    public void onFail(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSuccess() {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    @Override
    public String getName() {
        return edtTxtLoginAccount.getText().toString();
    }

    @Override
    public String getPassWord() {
        return edtTxtLoginPassword.getText().toString();
    }

    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.btn_login_login){
          	// 通知展示器
            loginPresenter.login();
        }
    }
}
  • Presenter 展示器的实现
public class LoginPresenter implements LoginContract.Presenter {

    private LoginContract.View view;
    private LoginModel loginModel;

    public LoginPresenter(LoginContract.View view) {
        this.view = view;
        loginModel=new LoginModel();
    }

    @Override
    public void onSuccess() {
        // 通知视图
        view.onSuccess();
    }

    @Override
    public void onFail(String msg) {
        // 通知视图
        view.onFail(msg);
    }

    /**
     * 登录方法
     */
    public void login(){
        //将view中的参数获取出来。
        String name = view.getName();
        String psw = view.getPassWord();

        // 调用一下业务处理model层的登陆方法
        loginModel.login(name,psw,this);
    }

}

总结:

以上就是对登录过程简单的一次MVP 模式的实现,具体代码已经上传到github,点击 MVPModuleDemo 即可查看。其实MVP模式困难的地方就是要明确好各个位置各自负责的工作,具体的实现对号入座就可以了。

android mvp代码生成插件 mvp模板代码自动生成,简化大家采用mvp开发时需要写大量重复模板代码的工作。大家下载好后,androidStudio选择从本地安装插件,选择你下载插件存放的文件夹,安装,重启androidstudio即可使用 立即下载

相关推荐

Android项目之MVP设计模式源码

作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。 在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的改变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。 虽然 MVC 中的 View 的确“可以”访问 Model,但是我们不建议在 View 中依赖 Model,而是要求尽可能把所有业务逻辑都放在 Controller 中处理,而 View 只和 Controller 交互。

Android: MVC MVP MVVM

在第二篇博客中,用MVP实现手机号码归属地查询APP:传送门.并简单提了一下MVC与MVP. imooc课程学习总结 传统模式下实现一个简单的功能,Activity需要写很多代码: NormalActivity: package com.yinlei.mvcdemo.normal import androidx.appcompat.app.AppCompatActivity...

手写我对你的温柔 708

Android MVP思想实现项目源码

Android MVP思想实现项目源码,MVP使用的整个流程。欢迎下载学习。

android mvp代码架构,android-MVP架构

MVP简介MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。如图所示:imageView 对应于Activity、Fragment,负责界面的绘制以及与用户交互Model 依然是业务逻辑和实体模型Presenter 负责完成View于Model间的交互设计前思考:首先在我们常用的MVC模式中,Activity承载了太多,做了不只是视图层...

weixin_31459571的博客 241

Android Studio模板-基于java的一键生成MVP架构基础代码

Android Studio模板-基于java的一键生成MVP架构基础代码

十二、基于FPGA实现slave SelectMAP配置逻辑

slave SelectMAP配置

weixin_41838250的博客 8753

android mvp 代码范例,Android MVP开发模式有案例和源码,反正我能看懂的MVP

丁先森 博客园MVP 理论知识在MVP 架构中跟MVC类似的是同样也分为三层。Activity 和Fragment 视为View层,负责处理 UI。Presenter 为业务处理层,既能调用UI逻辑,又能请求数据,该层为纯Java类,不涉及任何Android API。Model 层中包含着具体的数据请求,数据源。三层之间调用顺序为view->presenter->model,为了调用安...

weixin_32662187的博客 444

CarPlay wired(USB)连接方案

CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,支持USB Host Mode,该模式要求车载设备能够工作在USB device模式下,因为Apple设备在CarPlay中是作为USB Host的。而通常情况下,车载设备USB是工作在USB Host模式的,而外接的USB设备是工作在USB Device模式的,因而在这种情况下的CarPlay wired(USB)连接方案中就需要进行USB的模式切换。模式切换完成后便是Apple设备(USB HOST)的枚

Ke8323的博客 1万+

android mvp代码书写,android mvp分层架构优雅写代码

背景看了好多android技术博客,写android分层架构的博客越来越多,有mvc、mvp、mvvm、clean等各式各样的,而mvp异常火热,然而每个人对mvp的定义又是不同,写法自然也是千紫万红。目的写一个实用分层清晰的mvp架构主题mvp无非 model(数据)、view(界面)、presenter(逻辑)。model对应本地持久化或远程服务端数据,而在笔者看来其实就是对应一个bean对象...

weixin_30093159的博客 263

手把手教你:如何为自制的STM32H7飞控板适配PX4固件(基于NuttX)

本文详细介绍了如何为自制的STM32H7飞控板适配PX4固件,基于NuttX系统进行移植。从硬件设计规范到软件环境配置,再到PX4固件的移植与调试,提供了完整的实战指南。特别分享了如何复用FMU-v6u参考设计以节省开发时间,并解决了常见问题,帮助开发者快速实现高性能飞控系统的搭建。

weixin_27697385的博客 475

给STM32 LWIP做一次‘性能体检’:手把手教你用Wireshark和iperf诊断网络瓶颈

本文详细介绍了如何使用Wireshark和iperf工具对STM32 LWIP网络性能进行全面诊断,帮助开发者精准定位网络瓶颈问题。通过搭建测试环境、集成iperf测试框架、深度报文分析和LWIP配置优化,实现从9KB/s到80MB/s的性能飞跃,特别适用于解决TCP发送速率和卡死问题。

weixin_29631169的博客 288

【Android】一键生成MVP代码-DevMvp快速开发框架

mModel.onDestroy(); } } }/**public class PBookImpl extends BasePresenter implements CBook.IPBook { public PBookImpl(Context mContext, CBook.IVBook mView) { super(mContext, mView, new MBookImpl()); } @Override public void pBook() {

2401_84132381的博客 462

景区导览系统|景区展馆智能导览|小程序导览|电子导览手绘地图制作

AI 数字导游就像一位随时陪伴在游客身边的专属导游,能够根据游客的提问,迅速、准确地提供详细的景点介绍、历史文化知识讲解,甚至能根据游客的兴趣爱好和实时位置,为其智能规划个性化的游览路线。在手绘地图中可以显示景区中的景点信息、景点和景点之间的路径,也可以显示景区的关键地点信息:景区全景、植物景观、河流、道路、地形面貌、卫生间等公共设施~无论是景区还是展馆,道可云AI智能导览系统都能通过丰富的功能、先进的技术,为游客打造便捷、智能、个性化的游览体验,成为文旅行业数字化转型的得力助手。

道可云 1142

Android MVP插件 自动生成MVP框架

对于MVP,其实是非常适合在Android项目中使用的架构,如果你目前还不清楚MVP的架构究竟是什么样子,那么可以参考Google给出的示例: https://github.com/googlesamples/android-architecture 如果当前这个MVPPlugin不能满足你的需求(很多时候,会根据自身对MVP结构做调整),你可以自己查看插件的写法,做一些符合你所使用的规则上的调整...

攀岩嘉 3992

【3D无序抓取】--终极技术详解

3D无序抓取技术详解:从感知到执行的全流程技术方案 本文系统梳理了3D无序抓取(Bin Picking)的核心技术栈,涵盖3D感知、抓取规划和机器人执行三大环节。在3D感知层,详细介绍了点云采集与预处理方法(PCL/Open3D)、物体分割(PointNet++)和位姿估计(PVN3D/DenseFusion)等关键技术。抓取规划部分重点解析了抓取生成(GraspNet)、质量评估(Dex-Net)和动态避障(MoveIt!)算法。机器人执行环节则涉及路径规划、力控技术和末端执行器选型。同时提供了完整的工具

weixin_45590420的博客 596

Dify 系列教程 | 第 6 篇:工作流入门 -- 用可视化方式编排 AI 逻辑

Dify 工作流是一个基于有向无环图(DAG)的可视化 AI 逻辑编排系统。你可以把多个处理步骤(节点)用连线串联起来,数据从起点流向终点,每经过一个节点就被处理一次。用一个类比来理解:如果单次 Prompt 调用是"一道菜",那工作流就是"一道完整的生产线" – 原材料(输入)进入流水线,经过清洗(预处理)、切配(数据转换)、烹饪(AI 推理)、装盘(格式化输出)等工序,最终产出成品。创建一个工作流类型的应用(或高级聊天类型),就会进入工作流编辑器。编辑器基于ReactFlow构建(

weixin_43674738的博客 118

Android Studio插件之MVPHelper

Android Studio插件之MVPHelper MVP盛行,听到的最多的抱怨就是咋要写这么多接口,本文提供了一个插件,自动生成这些接口的声明。感兴趣的还可以学**该插件的写法,按照自己平时的需求修改,提供开发效率。 MVPHelper 一款Intellj IDEA 和Android Studio的插件,可以为MVP生成接口以及实现类,解放双手。 Github 地址 https:/...

每一件自己觉得值得的事都要不留余力的去做 1364

SAP PFCG 中的单一角色与复合角色

在 SAP 系统的安全与授权管理中,事务码 PFCG(角色维护)扮演着关键角色。理解单一角色(Single Role)和复合角色(Composite Role)的概念,对于有效地管理用户权限至关重要。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1476

MVPArms框架终极指南:30分钟快速搭建企业级Android应用架构

MVPArms是一个整合了大量主流开源项目的高度可配置化Android MVP快速集成框架,它能帮助开发者显著提升开发效率,轻松构建稳定可靠的企业级Android应用。无论是新手还是有经验的开发者,都能通过本指南快速掌握MVPArms的使用方法。 [![MVPArms框架Logo](https://raw.gitcode.com/gh_mirrors/mv/MVPArms/raw/8adc86b

gitblog_00189的博客 848

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android快捷创建MVP模板

Android快捷创建MVP模板 序言: MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互...

xiangxiang_8_8的博客 505

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Dagger2依赖注入框架

Dagger2简介: Dagger: “A fast dependency injector for Android and Java“,其最大的好处就是莫跨界见解耦,这个耦合是由类之间的以来引起的,依赖注入的配置独立于初始化出,配置更改方便,可提高代码的健壮性和可维护性 Dagger2相较于Dagger1的优势: (1)更好的性能:相较于Dagger1,Dagger2使用的预编译期间生成代码...

DLUT_WJX的博客 263

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

studio模板,一键生成多个类,mvp党福利

  人类进步的根源是什么?是懒惰,是的,没有错,就是懒惰,正是当你想偷懒时,你才会去寻找更便捷的方法搞定一件事。写代码也是一样的,不想偷懒的程序猿不是好程序猿,下面我们来看看如何“偷懒”。   首先,声明一下,本文的作用纯属抛砖引玉,并不会太详细的介绍具体使用方法,仅仅介绍大概使用思路及踩坑日记。虽然本文以mvp为例,但是本文所讲的内容不局限于此,基本上所有的模板代码,你都可以生成模板,方便后面使...

weixin_34235105的博客 255

AndroidStudio MVPPlugin

MVPPlugin插件 前言 从Google推出官方MVP架构demo到现在大概有一年多的时间了,半年前大概在所有的Android技术社区都有提到MVP架构,现在关于MVP架构的话题似乎没有以前那么多了,可能是因为大家都已经能够熟练的使用MVP了。在这里先炒碗闲饭,提供了一个快速生成MVP模式...

chifu0892的博客 221

Android的MVC MVP MVVM模式

学习Android的同学一定要了解的三种开发模式,不然自己写的项目采用的什么模式都不清楚MVC,MVP,MVVM都是为了解决UI页面与逻辑代码分离而出现的模式,MVP和MVVM都是MVC的基础上演化而来MVC全名是Model View Controller,是模型(mV----odel)-视图(view)-控制器(controller)的缩写M——模型层(Model)负责处理数据的加载或者存储V——视图层(View)负责界面数据的展示,与用户进行交互C——控制器层(Controller)负责逻辑业务的处理在

Ai1114的博客 2万+

Android开发MVP模式解析

在开发Android应用时,相信很多同学遇到和我一样的情况,虽然项目刚开始构架时一个Activity里面

冥萧阳的专栏 2万+

android studio 一直build model_【Android】一键生成MVP代码-DevMvp快速开发框架

序言每个程序员看到一堆烂代码都有一颗重构的心。烂代码写起来嘴上 笑嘻嘻,心里mmp。特别是有代码洁癖的人。重构不易且行且珍惜,此框架将减少开发时间。如果你们的项目结构跟我的不一样,这也不用担心,你看了我这个,简单修改一下模板,照样能生成你想要的代码。MVP架构相信大家对于MVP耳熟能详了,理解的直接往下看,如果概念比较模糊,可以网上查一查理解理解,我这边简单的介绍一下,可以配合下图来理解View层...

weixin_29297127的博客 2113
上一篇: Android面试资料整理
下一篇: Hybrid开发—WebView与js交互实现
谦行
博客等级 码龄11年 182粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值