架构师之路app应用开发框架Android

7. 卷死了---Android 抖音实战Hilt注入retro

2021-12-31  本文已影响0人  鹏城十八少

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

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

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

上一篇下一篇

猜你喜欢

热点阅读