超级简洁、彻底组件化的轻量级Android Kotlin Jetpack MVVM组件化框架

news2024/9/27 21:29:15

结构

特点:

  • 彻底组件化,且更简洁,Module具有独立的Application、AndroidMinifast、资源文件等;Application和Library的切换更加快捷;
  • 超级简洁、且多功能的网络层封装,自带2级缓存,App端内嵌了日志查看,测试人员,接口错误,该知道找谁了吧;
  • 更简洁的组件使用,更少的代码实现最全的功能,灵活扩展,随时扩展新的组件;
  • 组件与组件之间,主App与组件之间不存在任何依赖关系,快速集成,也可快速分离
  • 弃用@Aroute,使用自定义@MyRoute路由,编译器自动化路由配置管理,更简单的路由跳转参数传递与参数接收
  • 更简单的SharedPreferences使用,再也不需要自己写setXXX(),getXXX()了,皆有编译器自动生成
  • 最新的技术实现方案,Retrofit2、OkHttp3、ViewModel、DataBinding、LiveData等jetpack组件,以及Kotlin协程技术方案
  • 无需Repository层,在网络封装层,已经实现了对缓存的2级处理,如果要实现其他业务,可在网络层对其继续扩展

组件化说明

  • 每个module都有独自的AndroidMinifast.xml文件,各自模块的权限,activity,service等声明,均在各自module声明;
  • 每个module都有独自的Application,启动就初始化的代码均放在该Module的application里,可以直接脱离主app直接运行;
  • 每个module都有独自的ApiService,且需在各自的Application中注册,以保证module在application模式下可以直接运行;

有多精简?先举了栗子,以登录为栗:

一、登录接口定义:

@MyApiService(
    mName = "API",//给接口起个名成,随后可以通过这个名称直接调用接口的方法。
    mPath = "http://www.chenliang.com/app/",//成产环境
    mDevPath = "http://www.chenliang.com/dev/app/",//开发环境
    mTestPath = "http://www.chenliang.com/test/app/"//测试环境
)
interface ApiService {
    @MyRetrofitGo(mTag = "登录", mLoading = true,mCache = false ,mFailToast = true,mSuccessCode = 1001)
    @POST("home/login")
    fun login(
        @Query("account") account: String,
        @Query("password") password: String
    ): Data<BeanUser>
}

  • API环境随时切换:path最好统一放在一个地方管理
    mPath = "http://www.chenliang.com/app/",//成产环境
    mDevPath = "http://www.chenliang.com/dev/app/",//开发环境
    mTestPath = "http://www.chenliang.com/test/app/"//测试环境

二、登录ViewMode:

  • 通过@MyApiService注解指定的mName名称,直接调用接口:
class AccountViewModel : MyBaseViewModel() {
    fun login(account: String, pass: String) = go { API.login(account, pass) }
}

三、登录Activity:

@MyClass(mToolbarTitle = "登录")
@MyRoute(mPath = "/account/Login")
class LoginActivity : MyBaseActivity<AccountActLoginBinding, AccountViewModel>() {
    var user = BeanUser()
    override fun initCreate() {
        mBinding.user = user
        //监听编辑框输入状态,手机号设置成130 7876 7657 格式
        account.changed { account.setText(it.insert(" ", 3, 7)) }
    }

    //去注册
    fun registerAction() { goto(RegisterActivity::class.java, "user", user) }

    fun loginAction() {
        //登录验证
        if (user.name.check(MyCheck.empty, "请输入账号", MyCheck.mobilePhone, "手机号格式不正确") ||
            user.password.check(MyCheck.empty, "请输入密码", MyCheck.LENGTH(6, 12), "密码长度在6-12之间")
        ) return
        //登录接口
        mViewModel.login(user.name, user.password).obs(this@LoginActivity) {  it.y { loginSuccess(it) }  }
    }

    private fun loginSuccess(user: BeanUser) {
        user.save()//把登录后user数据保存到sp
        goto(appMain)//跳转到Main界面
        finish()
    }

    //注册后,登录界面回显账号信息
    @Subscribe(code = 100)
    fun eventRegister(user: BeanUser) {
        this.user = user
        user.password = ""
        mBinding.user = user
    }

}
  • R.layout.login在哪里指定?
  • ViewModel在哪里初始化?
  • AccountViewModel就1行代码?
  • 是的,极简框架,就这么简单!

四、组件之间的跳转与消息传递

  • 组件之间的跳转与参数传递
 //跨组件--->跳转到目标页【跨组件,建议使用path跳转,当然,也可以使用class跳转】
 goto("/app/main", "username", "tom", "age", 15)
 goto("/app/fragment", "user",user)
 //组件内--->跳转到目标页【组件内,建议使用class跳转,当然,也可以使用path跳转】
 goto(MainActivity::class.java, "username","tom",  "id","UID121231","age", 15 ,"sex",2)
 goto(UserFragment::class.java, , "user",user,"param1", "value1","param2",vlue2, "param3", true ,"param4",2F,......)//想传递几个值,后面跟上即可

 //目标Activity or Fragment参数接收
 @MyField(mKey = "beanUser")//指定key为:beanUser
 lateinit var user: BeanUser

 @MyField(mKey = "param1")//指定key为:param1
 lateinit var param1: String

 @MyField//默认key为变量名称param2
 lateinit var param2: String

  • 组件之间的消息传递与事件回调
//仅发送数据
var user=BeanUser("tom",12)
user.postSelf(1002)

//仅接受数据
@Subscribe(code = 1002)
fun eventRegister(user: BeanUser) {
      //接收到user
}

//发送数据、并且回调接收数据
var user=BeanUser("tom",12)
user.postSelf(1002){
    mytoast(it.getStringExtra("message")!!)
}

//接受数据,并且回调数据给发送者
@Subscribe(code = 100)
fun eventCallBack(event: RxBusEvent<BeanUser>) {
   mytoast("消息收到${event.data.toJson}")
   event.callback("message", "回调成功")
}

五、View组件的使用,更简单,例如Dialog:

默认dialog:

        MyDialog().message("确定删除用户?")
            .y { toast("确定被点击") }
            .n { toast("取消被点击") }
            .show(this)

        //或者
        dialog("确定删除用户?")
            .y { toast("确定被点击") }
            .n { toast("取消被点击") }
            .show(this)

默认dialog【自定义文案】:

        MyDialog().message("确定提交订单?")
            .y("提交") { toast("提交被点击") }
            .n("关闭") { toast("关闭被点击") }
            .show(this)
        //或者
        dialog("确定删除用户?")
            .y("提交") { toast("提交被点击") }
            .n("关闭") { toast("关闭被点击") }
            .show(this)

自定义dialog:

  • mDialogGravity:指定位置
  • mDialogAnimation:指定是否启用动画[Gravity.BOTTOM:底部向上动画,其他;伸缩、透明度动画]
  • mDialogAnimationTime:指定动画时长
  • mDialogTransparent:指定是否透明
     @MyClass(mDialogGravity = Gravity.BOTTOM, mDialogTransparent = true ,mDialogAnimation = true,mDialogAnimationTime = 300)
     class DialogDemo : MyBaseDialog<DialogLayoutBinding>() {
        override fun initCreate() {
            mRootView.confirm.click { dismiss() }
        }
     }

六、更精简的RecyclerView列表分页功能,2行代码,包含了下拉刷新,加载更多,下一页预加载,且支持多TypeItem:

   refreshRecycler.bindData<BeanItem> { (it.binding as ItemRecyclerviewBinding).item = it }
   refreshRecycler.loadData { httpGetData() }

七、各个组件根据@MyRoute注解,统一自动生成配置文件MyRoutePath类,如Account组件模块:

@MyRoute(mPath = "/account/login")
class LoginActivity : MyBaseActivity<AccountActLoginBinding, AccountViewModel>() {//Activity
        .
        .
        .
        .
}
@MyRoute(mPath = "/account/register")
class RegisterActivity : MyBaseActivity<AccountActLoginBinding, AccountViewModel>() {//Activity
        .
        .
        .
        .
}
@MyRoute(mPath = "/account/my")
class MyFragment : MyBaseFragment<AccountFgMyBinding, DefaultViewModel>() {//Fragment
        .
        .
        .
        .
}

各个组件会自动生成路由配置管理类MyRoutePath

public object MyRoutePath {
  public val accountLogin: String = "/account/Login|com.chenliang.account.act.LoginActivity"

  public val accountRegister: String = "/account/Register|com.chenliang.account.act.RegisterActivity"

  public val accountMy: String = "/account/my|com.chenliang.account.fragment.MyFragment"
}

路由跳转,比如由app Module组件跳到Account Module组件的登录Activity,直接调用如下代码:

 goto(accountLogin)

八、更简单的SharedPreferences使用,在Base组件中只需要配置MyConfig类,则会自动生成MySp类,如下:

MyConfit配置

class MyConfig {
    @MySpConfig
    var isLogin = false;

    @MySpConfig
    var isFirst = false

    @MySpConfig
    var ohter = ""

}

自动生成MySp类,可直接调用setXXX,getXXX方法保存和设置SharedPreferences数据

public object MySp {
  public fun setLogin(login: Boolean): Unit {
    MySpUtis.putBoolean("isLogin", login)
  }

  public fun isLogin(): Boolean = MySpUtis.getBoolean("isLogin")

  public fun setFirst(first: Boolean): Unit {
    MySpUtis.putBoolean("isFirst", first)
  }

  public fun isFirst(): Boolean = MySpUtis.getBoolean("isFirst")

  public fun setOhter(ohter: String): Unit {
    MySpUtis.putString("ohter", ohter)
  }

  public fun isFirst(): String = MySpUtis.getString("ohter")
}

很多开发者以前根本就没有接触过组件化开发,对其中的技巧和用法不是很了解,考虑到这些问题,在这特别准备了《Android组件化强化实战》 帮助大家去熟知该功能的应用。

第一章 Android组件化初识

第二章 Android组件化初探:https://qr21.cn/CaZQLo?BIZ=ECOMMERCE

第三章 架构演化(大厂篇):https://qr21.cn/CaZQLo?BIZ=ECOMMERCE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盛元广通高校实验室安全智能管理平台

实验室安全问题一直以来都是高校管理的重点&#xff0c;依据《高等学校实验室安全规范》相关要求&#xff0c;应教育相关部门以及应急管理部门的相关规定&#xff0c;关于安全工作的系列重要指示和部署&#xff0c;必须按照危险源管控分级管理体系对实验室进行分级分类管理&…

ebay、速卖通、ozon销量下滑怎么办?怎样可以提高转化率

单量不好&#xff0c;就开始焦虑&#xff0c;而真正需要了解为什么会出现销量下滑的原因&#xff0c;从不断更新自己的知识&#xff0c;提高自己的技能&#xff0c;如何提高自己的技能呢&#xff1f; 把所学到的知识学以致用&#xff0c;listing的评分&#xff0c;退货率&…

ESP32学习四-自定义分区表

1、简介 ESP32-WROOM-32集成了4MB SPI FLASH。对应的&#xff0c;也会对这4MB FLAHS进行分区处理。在编译esp32程序时&#xff0c;通过make menuconfig -> Partition Table可以设置三种分区。 工厂程序&#xff08;无OTA分区&#xff09; 工厂程序&#xff08;双OTA分…

自旋锁/读者写者问题

自旋锁 自旋锁的概念和理解 锁在处理需要申请加锁的线程的时候&#xff0c;一般有两种处理方法&#xff1a;一种是挂起等待&#xff0c;另外一种是自旋。自旋即轮询。 挂起等待&#xff1a; 当一个线程成功申请锁&#xff0c;并进入临界区后&#xff0c;其它线程在申请的时候…

【经验分享】硬件工程师需要知道的DFM可制造性设计

最近&#xff0c;有硬件工程师朋友找我讨论DFM&#xff0c;也就是可制造性设计。Design for Manufacturability。 什么是可制造性设计&#xff0c;看一张图很容易明白&#xff1a; 过大的PCB&#xff0c;无法上产线批量生产&#xff0c;极大的PCB面积浪费&#xff0c;自然是失…

Spring Batch 指南

SpringBatch 介绍 目前&#xff0c;Spring Batch是批处理框架界为数不多的优秀框架(Java语言开发)。 Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。 Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,…

.Net 6.0 部署Linux+Nginx +PM2教程

今天带大家将本地.Net6.0项目部署到Linux系统中,其中有用到Nginx反向代理和PM2进程管理工具,希望本偏文章能对你有所帮助,成为你成功路上的垫脚石! 背景: 在.Net 5.0横空出世之后,.Net已经支持夸平台了,身为一名合格的码农,你敢说你不会用Linux? 哈哈哈开个玩笑,因为工作最近接…

Idea启动运行报错:Error:java: 无效的源发行版: 13

最近在做Springboot项目时&#xff0c;常常出现上述错误&#xff0c;小编也不知道怎么回事&#xff0c;到网上找了这个方面的解决办法&#xff0c;但是却发现根本解决不了&#xff0c;最终通过小编多次尝试&#xff0c;终于发现&#xff0c;为什么会报这个错误。(应该是Java版本…

基于广泛数据增强的新型白质束ONE-SHOT分割

文章目录 One-Shot Segmentation of Novel White Matter Tracts via Extensive Data Augmentation摘要方法One-Shot分割的广泛数据增强 实验结果 One-Shot Segmentation of Novel White Matter Tracts via Extensive Data Augmentation 摘要 探索了新WM束的One-Shot分割问题由…

Kubernetes 如何保障容器可用性?一文介绍探针的使用

有时候&#xff0c;应用因为无限循环或死锁而停止响应&#xff0c;为确保应用在这种情况下可以重新启动&#xff0c;需要有一种机制检查应用程序的运行状况&#xff0c;而不是依赖应用程序内部的检测。 K8s 主要提供了三种探针来针对这种机制&#xff1a; 存活探针&#xff1a…

Swift之深入解析内存安全

一、内存安全 一般来说&#xff0c;Swift 会阻止代码中的不安全行为。例如&#xff0c;Swift 会保证变量在被使用前已经初始化&#xff0c;在释放某变量后其内存也会变得不可访问&#xff0c;以及检查数组索引是否存在越界错误。Swift 还通过要求修改内存中位置的代码具有对该…

通达信缠论顶底分型选股公式(一笔优化版)

在前文《缠论底分型选股公式&#xff0c;处理了包含关系》中介绍了缠论底分型&#xff0c;并编写了选股公式。底分型条件比较容易满足&#xff0c;因此产生的信号比较多。有热心网友提出&#xff0c;可以用顶底分型构成一笔过滤信号。 缠论一笔的构成条件&#xff1a;两个相邻…

砷化镓,锑化铟的能带结构

目录 回顾 正课 1.锑化铟的能带结构 2.砷化镓的能带结构 3.混合晶体的能带结构 回顾 从结合力上看由共价键和离子键混合 化合物半导体从结构上来说具有闪锌矿结构 三五族半导体的能带结构&#xff1a; 1.导带结构 2.价带结构 3.禁带宽度 正课 能带结构的共同特征&#…

docker容器与网络模式|磁盘使用|内存使用|清理

docker容器与网络模式|磁盘使用|内存使用|清理 一 docker 网络模式二 docker的网络模式分类三 网络模式详解3.1host模式&#xff1a;3.2 container模式container模式操作 3.3 none模式3.4 brideg模式3.5 自定义网络 四 容器资源控制4.1 docker容器cpu压力测试4.2 设置CPU资源占…

SpringCloud 微服务随机掉线排查过程

一、背景 我们的业务共使用 11 台&#xff08;阿里云&#xff09;服务器&#xff0c;使用 SpringcloudAlibaba 构建微服务集群, 共计 60 个微服务, 全部注册在同一个 Nacos 集群。 流量转发路径&#xff1a;nginx -> spring-gateway -> 业务微服务。 使用的版本如下&a…

IGA_PLSM3D的理解1

文章目录 前言一、IgaTop3D_FAST.m给的参数二、Material properties 材料特性对Geom_Mod3D的理解 三、IGA准备对Pre_IGA3D的理解 输出1-----CtrPts&#xff1a; 输出2-----Ele&#xff1a; 输出3-----GauPts&#xff1a; 对Boun_Cond3D的理解 输出1-----DBoudary&#xff1a; 输…

Java入坑之类的派生与继承

一、继承 1.1继承的概念 Java中的继承&#xff1a;子类就是享有父类的属性和方法&#xff0c;并且还存在一定的属性和方法的扩展。 Subclass&#xff0c;从另一个类派生出的类&#xff0c;称为子类(派生类&#xff0c;扩展类等) Superclass&#xff0c;派生子类的类&#xff…

PC主流同步软件评测

因为一个要把超过13G的众多零散文件同步到webdav网盘的需求&#xff0c;将市面上一些知名的同步软件试用测试了一番&#xff0c;最终发现只有Syncovery满足需求 先把参与测试的同步软件列一下&#xff1a; GoodSync、FreeFileSync、微软SyncToy、KLS Backup、SecondCopy、Sma…

coreboot seabios

seabios现在是很多虚拟机的默认启动bios&#xff0c;这跟它的短小精干有很大关系&#xff0c;也跟它提供比较完备的legacy支持有关。 按照以下步骤把seabios制作成coreboot的payload&#xff0c; 下载seabios代码&#xff0c; http://code.coreboot.org/p/seabios/downloads…

学生成绩管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87700420 更多系统资源库…