MVC,MVP,MVPVM(二)提升效率之Templates

性能优化(一)堆内存分析 前言 通过Android Studio的Memory Monitor工具,对各种数据类型,如:boolean,int,float,long,SparseArray,HashMap等在内存的占用情况进行分析;对一些特定场景下的代码编写,如:String拼接,OnClickListener等所消耗的内存情况进行分析;分析方式很简单,只是为了确切的验证以往的诸多代码经验,并更好的实践。 Memory 阅读详情
文章目录

1.MVC,MVP,MVPVM(一)实践之路
2.MVC,MVP,MVPVM(二)提升效率之Templates

遗留问题

《MVC,MVP,MVPVM(一)实践之路》中讲到如何从MVC到MVPVM的转变,将各个模块分离,职责划清。不过有个缺点,就是类爆炸,为什么代码写着写着就MVC了,就是因为一个Activity搞定,写着爽。但是,如果要实现解耦,就一定意味着会有很多不同的职能类。如果采用mvp,或mvpvm的实现方式,每次在新建一个页面就需要差不多10+个文件,虽然逻辑简单,不过全都手动创建的话,是不是觉得还是MVC好。

so many class.png

解决方案

套用定义好的代码Templates,自动生成各个职能类。

mvpvm_templates.gif

模版地址:
https://github.com/listen2code/Test_MVPVM/tree/master/doc/MvpvmComponent

使用介绍

1.将写好的templates拷贝到本地
Android Studio.app/Contents/plugins/android/lib/templates/activities/
2.重启AndroidStudio,右键项目->New->Activity->MvpvmComponent
3.在打开的编辑页面输入ActivityName和layoutName,包名为”com.listen.test_mvpvm”
templates_input.png

根据Templates自动生成的类
classes_generate.png

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable name="data" type="com.listen.test_mvpvm.model.viewmodel.ITestMvpvmViewModel"/>
        <variable name="presenter" type="com.listen.test_mvpvm.presenter.ITestMvpvmPresenter"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@{data.text}"/>

        <Button
            android:id="@+id/btn_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_test"
            android:onClick="@{presenter.onClickAction}"
            android:text="@{data.buttonText}"/>

    </LinearLayout>
</layout>
public class TestMvpvmActivity extends AppCompatActivity implements ITestMvpvmView {

    private ActivityTestMvpvmBinding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_test_mvpvm);
        mBinding.setPresenter(new TestMvpvmPresenter(this));
    }

    @Override
    public void updateView(ITestMvpvmViewModel viewModel) {
        mBinding.setData(viewModel);
    }
}
public class TestMvpvmPresenter implements OnTestMvpvmListener, ITestMvpvmPresenter {

    private ITestMvpvmView mITestMvpvmView;
    private ITestMvpvmRepository mTestMvpvmRepository;

    public TestMvpvmPresenter(ITestMvpvmView iTestMvpvmView) {
        this.mITestMvpvmView = iTestMvpvmView;
        this.mTestMvpvmRepository = new TestMvpvmRepositoryImpl(this);
    }

    public void onClickAction(View v) {
        mTestMvpvmRepository.method("");
    }

    public void onTestMvpvmLoadSuccess(TestMvpvmModel data) {
        mITestMvpvmView.updateView(new TestMvpvmViewModel(data));
    }

    public void onTestMvpvmLoadFail(String errorMessage) {
    }
}
public class TestMvpvmRepositoryImpl implements ITestMvpvmRepository {

    private OnTestMvpvmListener mOnTestMvpvmListener;

    public TestMvpvmRepositoryImpl(OnTestMvpvmListener onTestMvpvmListener) {
        this.mOnTestMvpvmListener = onTestMvpvmListener;
    }

    public void method(String param) {
        new HttpTask() {
            @Override
            public void onRequestSuccess(TestMvpvmModel model) {
                mOnTestMvpvmListener.onTestMvpvmLoadSuccess(model);
            }
        }.path("http://xxxx/getMydeposit").execute();
    }
}
Templates介绍

Templates由3个xml描述文件,和一堆.flt文件组成。

template_1.png
template2.png

globals.xml.ftl:主要用于定义一些全局变量,正常如果要自定义模版的话,globals文件可以直接拷贝过去,不需要什么改动。

<?xml version="1.0"?>
<globals>
    <global id="hasNoActionBar" type="boolean" value="false" />
    <global id="parentActivityClass" value="" />
    <global id="excludeMenu" type="boolean" value="true" />
    <global id="generateActivityTitle" type="boolean" value="false" />
    <#include "../common/common_globals.xml.ftl" />
</globals>

template.xml:我们在新建模版时,会有个填写信息的页面,template文件主要用于描述该页面上的元素信息。
templates_input.png

<template
    format="5"
    revision="8"
    name="MvpvmComponent"
    minApi="7"
    minBuildApi="14"
    description="Creates mvpvm components">

    <category value="Activity" />
    <formfactor value="Mobile" />

    <!-- 上图中第一个"Component Name"输入框的描述 -->
    <parameter
        id="activityClass"// 唯一性ID,后面会在.flt中引用
        name="Component Name"// 输入框前的描述提示语
        type="string"// 输入值类型
        constraints="class|unique|nonempty"
        suggest="${layoutToActivity(activityLayoutName)}"// 输入约束
        default="Mvpvm"// 默认输入值
        help="The name of the component" />//底部提示语

    <parameter
        id="activityLayoutName"
        name="Layout Name"
        type="string"
        constraints="layout|unique|nonempty"
        suggest="${activityToLayout(activityClass)}"
        default="activity_mvp"
        help="The name of the layout" />

    <parameter
        id="isLauncher"
        name="Launcher Activity"
        type="boolean"
        default="false"
        help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />

    <parameter
        id="packageName"
        name="Package name"
        type="string"
        constraints="package"
        suggest="com.listen.test_mvpvm"
        default="com.listen.test_mvpvm" />

    <globals file="globals.xml.ftl" />
    <execute file="recipe.xml.ftl" />

</template>

recipe.xml.flt:将root目录下的.flt文件解析成.java文件,并打开。

<?xml version="1.0"?>
<recipe>

    <!-- 处理模版 -->
    <instantiate from="root/src/app_package/MvpActivity.java.ftl"
        to="${escapeXmlAttribute(srcOut)}/view/${activityClass}Activity.java" />

    <!-- 打开xin -->
    <open file="${escapeXmlAttribute(srcOut)}/view/${activityClass}Activity.java" />

</recipe>

MvpActivity.java.flt文件示例,引用template中的
“@{activityClass}”,”${activityLayoutName}”,就是在输入页面填写的ActivityName,和layoutName。将”@{}”解析后生成完整的Activity.java。其实Templates的原理,就是将你需要生成的java文件的公用部分抽取出来,用”@{}”占位符,替代会变化的keyWord,写成一个个.flt模版文件,同时在输入面板中将keyWord输入,并通过template.xml,recipe.xml等描述文件,最终合成我们需要的java文件。

public class ${activityClass}Activity extends AppCompatActivity implements I${activityClass}View {

    private Activity${activityClass}Binding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.${activityLayoutName});
        mBinding.setPresenter(new ${activityClass}Presenter(this));
    }

    @Override
    public void updateView(I${activityClass}ViewModel viewModel) {
        mBinding.setData(viewModel);
    }
}

通过定义Templates,在每次新建一个页面时节省了大量重复的类创建工作,我们可以运用Templates定义各种页面模版,可以大幅度的提升开发效率。在日常工作中,应该尽可能减少一些纯体力的,重复的代码拷贝。不过为优化,为解耦而增加再多类,分再多模块都是值得的。

Templates更详细介绍可以参考鸿洋的文章,这里不做赘述:http://blog.youkuaiyun.com/lmj623565791/article/details/51635533

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?.docx 政府科技管理者如何提升科技成果转化项目进场交易的备案效率? 立即下载

相关推荐

科技中介服务机构如何通过智能体技术提升服务效率与专业度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

MVC、MVP以及MVP+VM

文章目录MVC模式MVP模式MVP+VM模式总结 MVC模式 MVC模式的结构分为三部分,实体层Model,视图层View和控制层Controller。 工作原理:当用户触发事件,View层会发出指令到Controller层,由Controller层去通知Model层更新数据,Model层更新完数据后直接显示在View层上。 在Android工程中,View层对应xml布局文件,Controll...

陈德山 793

产业园区如何高效对接企业技术需求并推动成果转化?观点作者:科易网-国家科技成果转化(厦门)示范基地.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

MVC,MVP,MVPVM(一)实践之路

简介 分别使用MVC,MVP,MVP+VM,实践具体需求,对比优劣,逐步优化。 需求 实现我的押金页面,包含未缴纳,已缴纳,免押金3种状态 1.顶部title:3种状态展示不同文案; 2.金额:已缴纳,未缴纳状态金额字号,色值不同;免押金状态不展示; 3.底部tips:已缴纳,免押金状态展示不同文案;已缴纳状态,不展示; 4.按钮:未缴纳,已缴纳状态,文案,及点击事件

listen2code的博客 1735

政府科技管理者在推动科技成果转化时,如何高效整合区域创新要素资源?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

山区道路边坡落石隐患检测数据集VOC+YOLO格式241张1类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

DataBinding学习笔记(一)源码分析

DataBinding整体使用流程开发阶段UserModel.javapublic class UserModel { public String name; public String nickName; public int age; public UserModel(String name, String nickName, int age) {

listen2code的博客 2505

高空作业栏杆检测数据集VOC+YOLO格式230张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

高仿蘑菇街欢迎页

蘑菇街欢迎页高仿效果这里这里…Demo下载地址前言 本文将介绍如何对蘑菇街欢迎页效果进行分析,拆分,并一步步实现1个高仿版本,最重要的设计思路包括以下2点: 1.ViewPager切换时,通过offset偏移量动态修改View元素属性 2.canvas上精细化的控制旋,移,缩,透明等view属性变化,进行动态绘制 效果拆解 首先可以把整体效果拆分为静态,动态2部分。静态:1个支持

listen2code的博客 1238

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

光伏板太阳能板尘土灰尘脏污检测数据集VOC+YOLO格式1006张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

Android源码中的一种单例实现

单例模式的实现方式有懒汉,饿汉,双重校验锁,枚举,内部类等等,写法就不全部列举了。在读Android源码的时候无意间发现一个单例辅助类类类/frameworks/base/core/java/android/util/Singleton.java,可以实现懒汉式单例,写法挺奇特的,虽然是个hide类,不过拷贝出来就可以用了。 package android.util;/** * Singleton

listen2code的博客 1216

无功优化电网故障下分布式能源系统多目标优化[并网转换器(GCC)](Matlab代码&Simulink实现)

内容概要:本文详细介绍了基于Plecs或Simulink平台构建的全桥LLC谐振变换器仿真模型,重点研究了变频控制与移相混合控制策略下的闭环系统设计与参数优化方法。内容涵盖全桥LLC谐振变换器的工作原理、小信号建模技术(如扩展描述函数EDF)、PID控制器参数整定过程以及软开关实现条件,并通过仿真验证了系统在稳态输出性能、动态响应特性(如启动过程与负载阶跃)和频率调节平滑性等方面的优良表现。同时提供了完整的仿真模型、参数设计报告及说明文档,有助于读者复现结果并深入理解控制机制与建模细节。; 适合人群:具备电力电子、自动控制等相关专业知识背景,从事高效率电源设计、新能源变换系统研发的工程师及高等院校电力电子与电力传动方向的研究生。; 使用场景及目标:①掌握LLC谐振变换器的小信号建模与闭环控制系统设计方法;②学习并应用变频与移相结合控制策略提升电源转换效率;③支撑科研项目中的电力电子系统仿真验证或学位论文课题开发;④复现高水平学术论文中关于谐振变换器的控制方案与性能分析。; 阅读建议:建议结合所提供的仿真模型与参数设计资料,边运行仿真边对照文章内容理解控制逻辑与建模过程,特别关注小信号模型的建立方法与PID控制器参数整定环节,以增强对实际工程问题的分析与设计能力。

6.0运行时权限的总结与实践

为什么需要6.0运行时权限 更友好 6.0以前的安装时权限,会在应用安装时列出所有需要的权限,当列出一些危险权限时,用户不知每个权限的具体用途,可能因为这些权限警告而放弃安装应用。对于一些非装不可的应用,用户则不得不被迫接受所有权限,很容易安装了一些流氓APP,体验不佳。 6.0以后的运行时权限,可以在调用相关功能之前判断权限授权状态,并自定义提示弹框告知用户权限用途,使用户清楚了解之后,再

listen2code的博客 443

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文围绕两相交错并联Boost电路的Simulink仿真模型展开,旨在通过仿真手段深入研究该电路在电力电子系统中的工作特性与性能优势。文章系统阐述了两相交错并联Boost电路的拓扑结构、工作原理及其在提升系统效率、减小输入电流纹波、均衡电流分配方面的显著优势。通过构建完整的Simulink仿真模型,对电路在不同负载与输入条件下的动态响应、稳态性能及控制策略进行了全面分析与验证。重点设计并实现了电压电流双闭环PI控制策略,详细论述了PI控制器的参数整定方法、占空比调节机制以及交错并联所带来的均流效果。仿真结果表明,所构建的模型能够有效提升系统的动态响应速度与稳定性,显著降低输入电流的谐波含量与纹波幅值,验证了交错并联技术在中高功率DC-DC变换应用中的优越性。; 适合人群:具备电力电子技术基础、熟悉Simulink仿真的电气工程及相关专业本科生、研究生,以及从事电源系统设计、新能源变换器研发的工程技术人员。; 使用场景及目标:①学习和掌握交错并联Boost电路的拓扑结构、工作原理与建模方法;②开展电力电子变换器的仿真分析、控制器设计与参数优化;③为实际工程项目中的高性能DC-DC变换器设计,特别是追求低输入纹波和高功率密度的应用场景,提供理论支撑与仿真验证依据。; 阅读建议:建议读者结合Simulink模型文件同步操作,深入理解主电路各模块、双闭环控制结构及PWM调制环节的参数设置与逻辑实现,重点关注PI控制器的参数整定过程与交错控制的时序配合,并可通过调整输入电压、负载大小及控制参数进行对比实验,以深化对交错并联技术优势及其控制策略的理解。

【Seurat绘图进阶】从参数调优到美学定制:解锁DimPlot与FeaturePlot的隐藏技巧

本文深入探讨了Seurat包中DimPlot与FeaturePlot的进阶使用技巧,旨在解决单细胞数据可视化中的常见痛点。通过参数调优(如order、shuffle、raster)、颜色美学定制(使用RColorBrewer、viridis配色)以及性能优化(栅格化处理),并结合scCustomize包与patchwork排版,帮助用户将基础图表提升为信息清晰、可直接用于论文发表的出版级可视化结果。

lake5的博客 630
上一篇: MVC,MVP,MVPVM(一)实践之路
下一篇: 高仿蘑菇街欢迎页
listen2code
博客等级 码龄10年 7粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值