Android hilt使用

news2024/12/24 2:26:14
  • 一,添加依赖库

添加依赖库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 {
    //构造器注入创建
    @Inject
    public User() {
        Log.e("User", "new User()");
    }
}

2,注入调用

//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {

    //需要注入的实例化类
    @Inject
    User user;

    @Override
    protected 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
    @Provides
    User provideUser() {
        return new User();
    }
}
//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {

    //需要注入的实例化类
    @Inject
    User user;
    @Inject
    User user1;


    @Override
    protected 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
    @Provides
    User provideUser() {
        return new User();
    }
}

 2,调用

//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {

    //需要注入的实例化类
    @Inject
    User user;
    @Inject
    User user1;


    @Override
    protected 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 {

    @Inject
    User user;
    @Override
    protected 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
    @Provides
    User provideUser(@ApplicationContext Context context) {
        return new User(context);
    }
}

 打印如下

 这样就传入了Application的context了

参考

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

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

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

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

相关文章

关于前端学习的思考-浮动元素嵌套块级元素12.18

1、块级元素嵌套浮动元素 先摆图片,当橘色的盒子高度减少的时候,NK AD TB PK NN并不会减少。如何解决呢? 加一个overflow:clip或者hidden 2、浮动元素嵌套块级元素 加一个overflow:clip或者hidden 综上所述&#xff0…

2020 年网络安全应急响应分析报告

2020 年全年奇安信集团安服团队共参与和处置了全国范围内 660起网络安全应急响应事件。2020 年全年应急响应处置事件行业 TOP3 分别为:政府部门行业(146 起)医疗卫生行业(90 起)以及事业单位(61 起,事件处置数分别占应急处置所有行业的 22.1%、13.6%、9.2%。2020 年…

修改npm源码解决服务端渲染环境中localstorage报错read properties of undefined (reading getItem)

现象: 这个问题是直接指向了我使用的第三方库good-storage,这是一个对localStorage/sessionStorage做了简单封装的库,因为项目代码有一个缓存cache.ts有用到 原因分析: 从表象上看是storage对象找不到getItem方法, 但…

Vue3使用Three.js导入gltf模型并解决模型为黑色的问题

背景 如今各类数字孪生场景对三维可视化的需求持续旺盛,因为它们可以用来创建数字化的双胞胎,即现实世界的物体或系统的数字化副本。这种技术在工业、建筑、医疗保健和物联网等领域有着广泛的应用,可以帮助人们更好地理解和管理现实世界的事…

Selenium框架的使用心得(一)

最近使用selenium框架实现业务前端的UI自动化,在使用selenium时,有一些心得想要和大家分享一下~ Selenium是一款用于web应用程序测试的工具,常用来实现稳定业务的UI自动化。这里,不想对其发展历史做介绍,也不想用官方…

EXCEL SUM类函数

参考资料 万能函数SUMPRODUCT超实用的10种经典用法 目录 一. SUM二. SUMIF2.1 统计贾1的销售额2.2 > 900 的销售总额2.3 计算贾1和贾22的销售总额2.4 多区域计算 三. SUMIFS3.1 统计苹果,在第一季度的总数量3.2 统计苹果,在第一季度,>…

智能家居和智能家居控制设备有什么区别?

智能家居和智能家居控制设备在功能和用途伤的区别: 智能家居是一种整体的概念,它涵盖了整个家庭环境的智能化,包括智能家电、智能照明、智能安防等设备的互联互通和协同工作。智能家居的目标是通过中央控制器或智能音箱等设备,实现…

Python内置函数一览表

为了提高程序员的开发效率,Python 提供了很多可以直接拿来用的函数(初学者可以先理解为方法),每个函数都可以帮助程序员实现某些具体的功能。 举个例子,在 Python 2.x 中 print 只是一个关键字,但在 Pytho…

cefsharp120.1.8(cef120.1.8,Chromium120.0.6099.109)版本升级测试,其他版本H264版本

此版本最新版cef120.1.8,Chromium120.0.6099.109 此更新包括一个高优先级安全更新 This update includes a high priority security update. 说明:本版本暂时不支持264,其他H264版本参考119,116,114,110,109等版本 c…

Spring 原理(一)

Spring 原理 它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 Spring 特点 轻量级控制反转面向切面容器框架集合 Spring 核心组件 Spring 常用模块 Spring 主要包 Spring 常用注解 bean …

CUDA C:线程、线程块与线程格

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 第一百篇博客,写点不一样的。 当核函数在主机端被调用时,它会被转移到设备端执行,此时设备会根据核函数的调用格式产生对应的线程(…

如何应用基础故障编排?

基础故障编排是保障系统稳定性和可用性的关键环节。通过有效应用基础故障编排,组织能够更快速、更智能地应对系统故障,从而提升业务的可靠性和竞争力。本文将介绍如何应用基础故障编排! 1、选择合适的工具: 选择适合组织需求的基础故障编排工…

9. DashBoard

9. DashBoard 文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。 为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。 用户可以使用…

Mysql之Specified key was too long; max key length is xx bytes异常

问题原因:mysq索引的字段都太长了 767字节是 MySQL 版本5.6(以及以前版本)中 InnoDB 表的最大索引前缀长度限制,MyISAM 表的长度为1,000字节。在 MySQL 版本5.7及以上版本中,这个限制增加到了3072字节。 如果对 utf8mb4编码的 varchar 字段设…

python+torch线性回归模型机器学习

程序示例精选 pythontorch线性回归模型机器学习 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《pythontorch线性回归模型机器学习》编写代码,代码整洁,规则&#xf…

【操作系统】实验四 进程调度

实验名称: 实验四 进程调度 实验目的: 1. 加深理解有关进程控制块、进程队列的概念 2. 体会和了解优先级和时间片轮转调度算法的具体实施办法 实验内容: 1. 设计进程控制块 PCB 表结构(与实验一的结构相同)&#xff…

超详细整理,Java接口自动化测试实战-rest-assured

1、关于rest-assured rest-assured 是一个能够简化测试rest服务的Java DSL,像ruby或者python一样的动态语言去测试和验证http服务。 基于java并且兼容了groovy动态语言的特性,使我们像写脚本语言一样去测试http服务。 例如:你的http服务&a…

范仲淹:文能治盛世,武可镇山河

北宋景佑元年(公元1034)年,范仲淹回乡祭拜范氏宗祠。在苏州祖宅住了几天后,范仲淹决定在苏州南园旁边买一块地,在此处盖一处房屋,待老迈时回乡居住。 按照家乡的风俗,在破土动工之前&#xff0c…

Note3---初阶二叉树~~

目录​​​​​​​ 前言🍄 1.树概念及结构☎️ 1.1 树的概念🎄 1.2 树的相关概念🦜 1.2.1 部分概念的加深理解🐾 1.2.2 树与非树🪴 1.3 树的表示🎋 1.4 树在实际中的运用(表示文件系统…

软件试运行整体方案

一、 试运行目的 (一) 系统功能、性能与稳定性考核 (二) 系统在各种环境和工况条件下的工作稳定性和可靠性 (三) 检验系统实际应用效果和应用功能的完善 (四) 健全系统运行管理体…