MVVM封装

news2025/1/9 1:14:12

MVVM封装

  • 一.MVVM
    • 1.依赖
    • 2.mvvm封装
    • 3.业务层调用
      • 1.MainService
      • 2.MainRepository
      • 3.MainViewModel
      • 4.TestActivity
    • 4.独立运行main业务模块

一.MVVM

1.依赖

config.gradle

  //jetpack
    def lifecycle_version = "2.5.1"
    libLivedata = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    libViewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    libFragmentKtx = "androidx.fragment:fragment-ktx:1.5.5"
    //room
    def room_version = "2.4.0"
    libRoom = "androidx.room:room-runtime:$room_version"
    libRoomCompiler = "androidx.room:room-compiler:$room_version"//room kotlin注解
    libRoomKtx ="androidx.room:room-ktx:$room_version"
    libRoomRxjava = "androidx.room:room-rxjava2:$room_version"
    libRoomPaging = "androidx.room:room-paging:$room_version"

    //hilt依赖注入
    libHilt = 'com.google.dagger:hilt-android:2.46'
    libHiltCompiler = 'com.google.dagger:hilt-android-compiler:2.46'

base:build.gradle

    //jetpack
    api libLivedata
    api libViewmodel
    api libFragmentKtx
    //room
//    api libRoom
//    kapt  libRoomCompiler //注解
//    api libRoomKtx
//    api libRoomRxjava
//    api libRoomPaging
    //hilt依赖注入
//    api libHilt
//    kapt libHiltCompiler

注意:所有的build.gradle配置,

 dataBinding{
        enabled = true
    }

2.mvvm封装

在这里插入图片描述

open class BaseRepository {
    /**
     * 创建对应的service api接口
     */
     fun <T> createApiService(service:Class<T>):T{
         return RetrofitManager.getRetrofit().create(service)
     }
}
open class BaseViewModel:ViewModel() {
    //所有ViewModel公共方法
}
/**
 * 1。沉浸式状态栏
 * 2。DataBinding findViewById
 * 3。initData():数据
 * 4.initListener():点击事件
 * 5。EventBus事件总线封装
 * 6.数据加载中,数据加载失败,数据加载成功,无网络等
 *
 */
abstract class BaseActivity<VDB:ViewDataBinding>:AppCompatActivity() {
    protected lateinit var viewDataBinding:VDB

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewDataBinding = DataBindingUtil.setContentView(this,getLayout())//initView
        initListener()
        initData()
    }
    abstract fun getLayout():Int //返回布局id
    abstract fun initData() //初始化数据
    abstract fun initListener()//事件监听
}
abstract class BaseMVVMActivity<VM:BaseViewModel,VDB:ViewDataBinding>:BaseActivity<VDB>() {
    protected val viewModel:VM by lazy { ViewModelProvider(this).get(getJVMClass()) }
    //子类重写 返回具体的viewmodel对应class文件
    abstract fun getJVMClass():Class<VM>
}

3.业务层调用

在这里插入图片描述

1.MainService

interface MainService {
    @GET("/banner/json")
    fun banner():LiveData<ApiResponse<MutableList<BannerEntity>>>

}

2.MainRepository

class MainRepository:BaseRepository() {
    //使用MainService请求轮播图数据
    fun banner():LiveData<ApiResponse<MutableList<BannerEntity>>>{
        return createApiService(MainService::class.java).banner()
    }
}

3.MainViewModel

class MainViewModel:BaseViewModel() {
    private var mainResponse = MainRepository()//仓库
    fun banner(): LiveData<ApiResponse<MutableList<BannerEntity>>> {
        return mainResponse.banner()
    }
}

4.TestActivity

class TestActivity : BaseMVVMActivity<MainViewModel,MainActivityTestBinding>() {
    override fun getLayout(): Int {
        return R.layout.main_activity_test
    }
    override fun initData() {
        viewModel.banner()
            .observe(this){
                viewDataBinding.tv.text = it.data.toString()
            }

    }
    override fun initListener() {
        viewDataBinding.tv.setOnClickListener {
            ToastUtils.showShort("hahah")
        }

    }
    override fun getJVMClass(): Class<MainViewModel> {
        return MainViewModel::class.java
    }

}

4.独立运行main业务模块

改为true
在这里插入图片描述
配置独立运行的清单文件
在这里插入图片描述

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

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

相关文章

谁懂啊!性能测试还能这么快学好。。。。。。

目录 前言 &#xff08;一&#xff09;用户视角看响应时间: &#xff08;二&#xff09;运维视角看系统的使用率 mysql等数据库关注指标 JVM&#xff08;针对java技术线&#xff09;&#xff1a;Java应用程序的CPU和内存使用率 系统最大处理的任务数&#xff1a; &#…

如何完善企业性能测试流程?详解测试计划编写与实现

目录 前言&#xff1a; 性能测试流程 性能测试计划 实例代码 总结 前言&#xff1a; 在现代技术领域中&#xff0c;性能测试是非常重要的一个流程。无论是应用程序、网站、数据库等&#xff0c;都需要经过严格的性能测试&#xff0c;以确保其能够在各种条件下保持稳定的性…

RabbitMq指南:彻底解决消息可靠性问题以及实现延迟队列

提到 RabbitMq&#xff0c;想必大家都不陌生&#xff0c;我们经常使用它来进行服务之间的异步通信&#xff0c;如短信&#xff0c;日志&#xff0c;邮件发送等业务场景都可以使用 RabbitMq 实现&#xff0c;但在使用的过程中我们会遇到消息丢失的问题&#xff0c;也会有延迟消费…

SSM(Spring篇)

Spring Spring的IOC和DI Spring简介 介绍 Spring的分层Java SE\EE应用full-stack轻量级开源框架&#xff0c;以IOC&#xff08;Inverse Of Control&#xff1a;反转控制&#xff09;和AOP&#xff08;Aspect Oriented Programing&#xff1a;面向切面编程&#xff09;为内核…

AOP参数校验

场景 在面试中&#xff0c;可能会问道AOP的适用场景有哪些&#xff0c;参数校验就是其中的一个例子 在Java使用登录or注册功能时&#xff0c;会需要用户提交邮箱手机号等信息&#xff0c;此时前端可能会做参数校验&#xff0c;以下代码是基于后端的参数校验&#xff0c;可适用…

不推荐你做网工,就因为这一个字

大家好&#xff0c;我是许公子。 我平时闲暇的时候&#xff0c;很喜欢在网上逛逛&#xff0c;看看大家最近都在聊什么。 这几天看到个问题。 网络工程师&#xff0c;累吗&#xff1f; 里面有不少回答觉得&#xff0c;网工这行&#xff0c;太累了。 “ 做实施的时候&#xf…

【学习记录22】git删除远程主分支和文件

项目分支太多&#xff0c;代码冗余太多&#xff0c;项目也没正式启用&#xff0c;想着全部清空重新来一遍&#xff0c;参考了网上的步骤都不太理想&#xff0c;全部走不通&#xff0c;搜出来大部分都是类似下面的操作。经过一段时间折腾终于删掉并清空。因此记录一下以备后期查…

小白入门SRC漏洞挖掘的正确姿势

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…

Azure Services -5.25-summary

文章目录 1. Resources2.Data processing process3.Virtual network and public ip address4. Kubernetes services5. Yaml file first , we enter the homepage of microsoft azure, and we can see a lot of servicse provided by the microsoft azure , 1. Resources accou…

SSM(SpringMVC篇)

SpringMVC SpringMVC简介 概述 SpringMVC是一种基于java的实现MVC设计模型的请求驱动类型的轻量级web框架&#xff0c;属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow中 SpringMVC已经成为目前最主流的框架之一&#xff0c;并且随着Spring3.0的发布&…

Excel高手与普通人之间的差距,全在这个比Access还简单的工具

用“Excel”还是用“Python”&#xff1f; 很多职场人&#xff0c;在工作的大部分时间都会和“Excel”打交道&#xff0c;普通人&#xff0c;我们用“Excel”的录入和统计等&#xff0c;很多功能是不会用的。 只有一部分人群&#xff0c;会“Excel”的高级操作&#xff0c;比…

毫米波雷达模块在自动驾驶系统中的关键功能

随着自动驾驶技术的快速发展&#xff0c;毫米波雷达模块作为一项关键技术&#xff0c;为自动驾驶系统提供了重要的感知和决策能力。毫米波雷达模块通过实时探测和跟踪周围环境中的车辆、行人和障碍物&#xff0c;提供精确的距离和速度信息&#xff0c;帮助自动驾驶车辆做出准确…

【干货】IPV6 知识点与OSPFv3 原理与配置

今天和海翎光电的小编咱们一起聊聊IPv6的报头。下图是IPV4和IPV6的对比图&#xff0c;个人感觉还是比较直观的&#xff0c;我们就以这张图来梳理IPv6的报头内容。 一、IPv4的报头内容 首先&#xff0c;我们先重新回顾一下IPv4的报头内容&#xff0c;对于这个内容比较熟悉的朋友…

第十二章 异常(Exception)

一、异常的概念&#xff08;P444&#xff09; Java 语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”。&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 执行过程中所发生的异常事件可分为两大类&#xff1a; &#xff08;1&#xff09;Error&…

Three.js--》实现3d圣诞贺卡展示模型

目录 项目搭建 初始化three.js基础代码 加载环境模型 设置环境纹理 添加水面并设置阴影效果 实现幽灵小球的运动 实现相机切换和文字切屏 实现漫天星星和爱心样式 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目…

QT 一个project调用另外一个project

1.随便建两个project, test888 (test888 里面随便写一个类如CHPerson), test999 2.把test888放在test999目录下 3.在test888里面手动创建一个test888.pri文件&#xff0c;里面内容如下: INCLUDEPATH $$PWDHEADERS \$$PWD/CHPerson.h \SOURCES \$$PWD/CHPerson.cpp \4.在tes…

集权设施攻防兵法:实战攻防之Exchange篇

一、黑客视角下的Exchange Microsoft Exchange Server是由微软开发的企业级邮件和协作平台。它提供了强大的电子邮件、日历、联系人和任务管理功能&#xff0c;使组织能够高效地进行沟通和协作。然而&#xff0c;它也时常受到攻击。 攻击者喜欢攻击Exchange服务器有两个重要原…

基于遗传算法的LQR控制器优化设计(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 5.1 理论基础 5.1.1 LQR控制 假设线性时不变系统的状态方程模型为 可以引入最优控制的性能指标&#xff0c;即设计一个输入量u,使得 为最小。其中&#xff0c;Q和R分别为状态变量和输…

JavaWeb ( 十 ) SpringMVC

4.Spring MVC Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。 三层架构分为表述层&#xff08;或表示层)、业务逻辑层、数据访问层&#xff0c;表述层表示前台页面和后台servlet 4.1.Spring MVC优点&#xff1a; ① 基于原生的Servlet&#xff0c;通过…

10 款最常用的Sketch在线插件!

Sketch 是一款高效、小巧的界面设计工具&#xff0c;在设计领域广受设计团队喜爱&#xff0c;帮助设计师创造了许多令人惊叹的作品。在使用 Sketch 时&#xff0c;辅助使用一些插件可以更高效地完成设计任务。Windows 也能用的「协作版 Sketch」即时设计&#xff0c;可作为网页…