当前位置: 首页 > news >正文

Android hilt使用

  • 一,添加依赖库

添加依赖库app build.gradle.kts

    implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49")

添加插件app build.gradle.kts

plugins {id("dagger.hit.android.plugin")
}

添加插件项目中 build.gradle.kts

plugins {id("com.google.dagger.hilt.android") version "2.49" apply false
}
  • 二,基本用法

1,自动生成对应组件,需要自定义application

//生成相应组件,Hilt会自动生成所需要的组件
@HiltAndroidApp
public class HiltApplication extends Application {
}
public class User {//构造器注入创建@Injectpublic User() {Log.e("User", "new User()");}
}

2,注入调用

//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {//需要注入的实例化类@InjectUser user;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("MainActivity", "new onCreate");}
}

打印如下

从打印中可以发现,Hilt的注入对象是我们打印位置之前的

  • 三,@Module注入,局部单利

改造代码如下

public class User {public User() {Log.e("User", "new User()");}
}
//将module加入对应作用域的容器,这里是ActivityComponent,作用域是 @ActivityScoped
@InstallIn(ActivityComponent.class)
@Module
public class UserMOdule {//添加activity的作用域 @ActivityScoped后,该类的在activity为单利@ActivityScoped@ProvidesUser provideUser() {return new User();}
}
//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {//需要注入的实例化类@InjectUser user;@InjectUser user1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("MainActivity", "new onCreate");}
}

代码打印如下

这里进行了多次注入User对象,实际上User的构造器之调用了一次,表明之创建了一次,所以这几个对象都指向这个创建的对象,所以在该类中为单利

  • 四,@Module注入,全局单利

修改代码如下

1,module

//SingletonComponent全局单利容器,其余的容器都是这个容器的子容器
@InstallIn(SingletonComponent.class)
@Module
public class UserMOdule {//添加单利全局单利作用域,该方法只会被调用一次@Singleton@ProvidesUser provideUser() {return new User();}
}

 2,调用

//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {//需要注入的实例化类@InjectUser user;@InjectUser user1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("MainActivity", "MainActivity new onCreate");startActivity(new Intent(this,MainActivity2.class));}
}
@AndroidEntryPoint
public class MainActivity2 extends AppCompatActivity {@InjectUser user;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);Log.e("MainActivity", "MainActivity2 new onCreate");}
}

调用打印

这里User创建了一次,和前面所讲对应

  • 五,Context类的注入

修改代码

public class User {public User(Context context) {Log.e("User", "new User() context " + context);}
}

 


//SingletonComponent全局单利容器,其余的容器都是这个容器的子容器
@InstallIn(SingletonComponent.class)
@Module
public class UserMOdule {//添加单利全局单利作用域,该方法只会被调用一次@Singleton@ProvidesUser provideUser(@ApplicationContext Context context) {return new User(context);}
}

 打印如下

 这样就传入了Application的context了

参考

Android之Dagger&Hilt依赖注入使用指南-CSDN博客

一看就会 Android中Hilt的各场景使用_android hilt-CSDN博客

相关文章:

Android hilt使用

一,添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…...

2023/12/17 初始化

普通变量(int,float,double变量)初始化: int a0; float b(0); double c0; 数组初始化: int arr[10]{0}; 指针初始化: 空指针 int *pnullptr; 被一个同类型的变量的地址初始化(赋值) int…...

【算法Hot100系列】三数之和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

CSS 简介

什么是 CSS? CSS 是层叠样式表(Cascading Style Sheets)的缩写,是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言。 CSS 的主要作用是: 控制网页的样式,如字体、颜色、背景、布局等提高网页的开发效率CSS 的语法 CSS 的…...

myBatis-plus自动填充插件

在 MyBatis-Plus 3.x 中,自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤: 1.基本配置 1.1添加 Maven 依赖: 确保你的 Maven 依赖中使…...

746. 使用最小花费爬楼梯 --力扣 --JAVA

题目 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 解题思路 到…...

使用Verdaccio搭建私有npm仓库

搭建团队的私有仓库,保证团队组件的安全维护和私密性,是进阶前端开发主管路上,必不可少的一项技能。 一、原理 我们平时使用npm publish进行发布时,上传的仓库默认地址是npm,通过Verdaccio工具在本地新建一个仓库地址…...

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好,我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了,火爆程度压过Google的Gemini。 缘起是MistralAI二话不说,直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…...

Golang 数组 移除元素 双指针法 leetcode27 小记

文章目录 移除元素 leetcode27暴力解法双指针法1. 快慢指针2. 双向指针 移除元素 leetcode27 go中数据类型的分类: 1.值类型:int、float、bool、string、数组、结构体 2.引用类型:指针、切片、map、管道、接口 由于切片为引用类型&#xff0c…...

c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

图像裁剪、调整大小、旋转、透视图像处理基本操作。 croppedImage 图像裁剪Cv2.Resize() 调整图像大小图像旋转 Cv2.Rotate()旋转Cv2.Flip()翻转Cv2.WarpAffine()任意角度旋转Cv2.GetAffineTransform()透视 一、图像裁剪 // 读取原始图像 Mat image new Mat("1.png&q…...

Kafka相关知识

一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协 调的分布式日志系统(也可以当做MQ系统),常见可以用于webynginx日志、访问日志,消息服务等等&…...

gitlab 通过svn hook 触发

jenkins 起一个item 配置: 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径, 注意是工程,不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器: ,重要的是要自…...

设计模式详解---单例模式

1. 设计模式详解 单例模式是一种创建对象的设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。 在单例模式中,类负责创建自己的唯一实例,并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有…...

毕设之-Hlang后端架构-双系统交互

文章目录 前言交互流程基本流程约定公钥人人中台携带公钥获取私钥私钥生成人人中台携带私钥访问私钥验证(博客系统) 调试演示总结 前言 前天我们完成了基本的整合,但是还没有整合到我们的业务系统,也就是博客系统。本来昨天要搞一…...

什么同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能,非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的,但是请求返回…...

破译模式:模式识别在计算机视觉中的作用

一、介绍 在当代数字领域,计算机视觉中的模式识别是关键的基石,推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式,模式识别不仅推动了计算机视觉领域…...

c语言-全局变量与局部变量

目录 1、(作用)域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语: 前言: 在c语言中,全局变量的可见范围是整个工程,而局部变量的可见范围从该变量被定义到该作用域结束&#xff0c…...

【Spring】00 入门指南

文章目录 1.简介2.概念1)控制反转(IoC)2)依赖注入(DI) 3.核心模块1)Spring Core2)Spring AOP3)Spring MVC4)Spring Data5)Spring Boot 4.编写 Hel…...

BIM 技术:CIM (City Information Modeling) 1-7 级

本心、输入输出、结果 文章目录 BIM 技术:CIM (City Information Modeling) 1-7 级前言城市信息模型(CIM)概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日,人无再少年实践是检验真…...

c++ websocket 协议分析与实现

前言 网上有很多第三方库,nopoll,uwebsockets,libwebsockets,都喜欢回调或太复杂,个人只需要在后端用,所以手动写个; 1:环境 ubuntu18 g(支持c11即可) 第三方库:jsoncpp,openssl 2:安装 jsoncpp 读取json 配置文件 用 自动安装 网…...

Webiny无头CMS深度解析:Serverless架构与插件化设计实战

1. 项目概述:一个面向未来的无头CMS与应用程序框架 如果你正在寻找一个既能让你快速构建企业级内容管理后台,又能让你拥有完全自定义前端体验的解决方案,那么 webiny/webiny-js 这个项目绝对值得你花时间深入研究。这不是一个简单的博客系统…...

基于Petals分布式网络的大语言模型聊天应用后端部署与API调用实战

1. 项目概述:一个基于分布式协作的大语言模型聊天应用后端最近在折腾大语言模型应用的时候,发现了一个挺有意思的项目:chat.petals.dev。这不仅仅是一个开源的聊天机器人Web应用,更关键的是,它背后连接着一个名为Petal…...

写给刚入行的测试新人:别急着学自动化,先把这件事做好

很多刚入行的测试新人,在浏览技术社区或与同行交流时,很容易被一种焦虑感裹挟。满屏的“自动化测试”、“性能测试”、“测试开发”,动辄月薪过万的招聘JD,让不少人产生一种错觉:不懂编程、不会写自动化脚本&#xff0…...

2026年DLL修复工具深度测评:免费解决DLL缺失的可行方案

电脑运行办公软件、打开大型游戏时,经常弹出XXX.dll 缺失、无法找到入口点、无法加载动态链接库等报错窗口?相信绝大多数 Windows 用户都遇到过这种糟心情况:好好的程序突然打不开,游戏双击没任何反应,重装软件不起作用…...

FPGA在软件无线电系统中的并行处理与动态重配置技术

1. FPGA在软件无线电系统中的核心价值FPGA(现场可编程门阵列)已成为现代软件无线电(SDR)系统的核心处理引擎。与传统DSP处理器相比,FPGA凭借其并行架构和可重构特性,在实时信号处理领域展现出独特优势。在典…...

工业控制、通信设备、医疗仪器:MX30LF2G18AC-TI的嵌入式存储应用版图

MX30LF2G18AC-TI:2Gb SLC NAND闪存的工业级存储方案在工业控制、嵌入式系统以及通信设备等领域,非易失性存储器的选择直接影响设备的数据完整性、运行稳定性及长期供货保障。MX30LF2G18AC-TI是旺宏电子推出的一款2Gb SLC NAND闪存芯片,采用成…...

AI舞蹈生成实战:从扩散模型原理到seedance-2.0部署与调优

1. 项目概述:从种子到舞蹈的AI生成革命最近在AI生成领域,一个名为“seedance-2.0”的项目引起了我的注意。这个项目名本身就很有意思,“seedance”可以拆解为“seed”(种子)和“dance”(舞蹈)&a…...

2026年中小企业性能测试平台:低成本易落地选型指南

中小企业在性能测试方面面临痛点:专业测试人员匮乏、预算有限、IT 架构相对简单、测试需求集中在基础接口与核心业务场景,无需复杂的企业级管控与大规模并发压测能力。因此,中小企业对性能测试平台的核心需求是:低成本、易落地、易…...

光耦LED寿命评估与可靠性设计实践

1. 光耦LED寿命评估的核心价值 在工业自动化控制系统中,我曾亲眼目睹一个价值数百万的生产线因为光耦器件失效导致整个控制系统误动作。故障排查时发现,正是光耦内部的LED光源经过5年连续工作后出现严重光衰,使得信号传输出现错误。这个教训让…...

告别Appium!用Python+uiautomator2搞定Android自动化测试(保姆级环境搭建指南)

告别Appium!用Pythonuiautomator2搞定Android自动化测试(保姆级环境搭建指南) 如果你正在为Appium的复杂配置、缓慢执行速度而头疼,或者厌倦了那些莫名其妙的连接问题,那么是时候尝试更轻量高效的解决方案了。uiautoma…...