7. 卷死了---Android 抖音实战Hilt注入retrofit: Dagger替换成Hilt

什么是依赖注入?---朱凯

这些都属于由外部来提供依赖的初始化,所以都是依赖注入

Hilt 好不好用,我们先来看看它是个什么。它是个用注解来进行配置的依赖注入库。注解是它的写法,首先它是个依赖注入库,对吧?什么是依赖注入?一个类里有两个变量,这两个变量就是它的依赖:

总结:通过外部进行赋值

依赖注入的好处:数据共享

比如:activity。Prsenter,module里面都要用同一个user,可以通过hilt实现数据共享。

hilt和dragger2的区别

hilt:使用简单,然后是场景化,不是封装

dragger2:使用复杂

一个注解就能让 Activity 内部的依赖自动被注入,而 Dagger 需要手动注入,就是调用inject方法!

ButterKnife 或者现在 Jetpack 推出的 ViewBinding 它们提供的功能,Hilt 提供了吗?

不好意思,Hilt 不提供它们的功能。Hilt 和 Dagger 虽然用法和 ButterKnife 很像,都是给变量加注解,然后变量会自动赋值,但它们的功能定位是不一样的:Hilt 和 Dagger 是做依赖注入的,而 ButterKnife 和 ViewBinding 是做视图绑定的。

Hilt是对Dagger2的封装。就像retrofit是对okhttp的封装一样。

那么 Hilt 是什么呢?Hilt 是一个内部使用 Dagger 的库,只是简化了它的用法,因此我在这里所说的有关 Dagger 的内容也适用于 Hilt

相比于Dagger2,Hilt最明显的特征就是:1. 简单。2. 提供了Android专属的API。

Hilt原理:

1.dagger里面的apt

2.自动注入,通过字节码插桩 javaassist,在oncrate之前,用另外一个activity!

Hilt 做的优化包括

无需编写大量的Component代码

Scope也会与Component自动绑定

预定义绑定,例如 Application与Activity

预定义的限定符,例如@ApplicationContext与@ActivityContext

————————————————

应用实战:网络请求的多个框架,封装成了代理模式,然后可以改成依赖注入!!!!

里面有application,activity,Fragment的注解

Hilt 应用类
所有使用 Hilt 的应用都必须包含一个带有 @HiltAndroidApp 注释的 Application 类。

@HiltAndroidApp
class MyApplication:Application() {
}

生成的这一 Hilt 组件会附加到 Application 对象的生命周期,并为其提供依赖项。此外,它也是应用的父组件,这意味着,其他组件可以访问它提供的依赖项。我们查看生成的源码可以看到一个Hilt_MyApplication类,这是此注解生成类之一,它是hilt组建全局的管理者

将依赖项注入 Android 类=============(是入口吗)
在 Application 类中设置了 Hilt 且有了应用级组件后,Hilt 可以为带有 @AndroidEntryPoint 注释的其他 Android 类提供依赖项,现在我们先在我们熟悉的MainActivity添加这个注释,看看会发生什么:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

可以使用注入框架进行实例的创建,不需要new

@Inject lateinit var user:User//定义一个User对线

实践:

第一步:添加依赖

根目录:

classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'

主目录:

apply plugin: 'dagger.hilt.android.plugin'

implementation "com.google.dagger:hilt-android:2.28-alpha"

annotationProcessor "com.google.dagger:hilt-android-compiler:2.28-alpha"

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 }</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">第二步:定义bean</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">
public class HttpObject {
}
</pre>

第三步:Module</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)
@Module public class HttpModule {

@Singleton

@Provides public HttpObject getHttpObject(){
return new HttpObject();
}
}
</pre>

同时把module安装到component里面去</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@InstallIn(ApplicationComponent.class)</pre>

<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">第四步:使用:注入点</pre>

注入到Activity

<pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@AndroidEntryPoint public class MainActivity extends AppCompatActivity {

@Inject

HttpObject httpObject; @Inject
HttpObject httpObject2; @Inject
public TestInterface testInterface; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); }</pre>

第五步:application中定义</pre>

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;"> <pre style="margin: 8px 0px; font-family: "JetBrains Mono", monospace;">@HiltAndroidApp public class MyApplication extends Application {
}
</pre> </pre>

Hilt 接口的使用

原理:最终通过module实现!!!!!!

一个接口很多实现类,接口具体实现。

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public interface TestInterface {

void method(); }

</pre>

2、提供一个实现接口的对象

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">public class TestClass implements TestInterface {

@Inject

TestClass() {
}

@Override

public void method() {
Log.i("TestClass", "TestClass注入成功!");
}
}
</pre>

3、编写对应Module

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Module @InstallIn(ActivityComponent.class)
public abstract class TestInterfaceModule {

// @Binds // public abstract TestInterface bindTestClass(TestClassTwo testClass //实现不同的 功能); @Binds
public abstract TestInterface bindTestClass(TestClass testClass); }
</pre>

4、最终使用

<pre style="margin: 8px 0px; background-color: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 0.817rem;">@Inject public TestInterface testInterface; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("hqk_MainActivity",httpObject.hashCode()+"");
Log.i("hqk_MainActivity",httpObject2.hashCode()+"");
testInterface.method(); </pre>

hilt对项目的一个封装(jetpack-hilt-flow-mvvm 超简洁实战项目)

https://www.jianshu.com/u/cf8709c5d63a

recycleView

https://www.jianshu.com/p/a1f21380a43d

https://www.jianshu.com/p/fd4f090c882e---朱凯视频

https://juejin.cn/post/6978407567047262222?share_token=d66a5860-52fe-4257-93d4-7bca921e8be3

https://juejin.cn/post/6902009428633698312?share_token=35134c40-3d98-47cf-95a0-1ec670f6bdca

demo:

https://blog.csdn.net/qq_30382601/article/details/118675425

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容