侧边栏壁纸
博主头像
慢行的骑兵博主等级

贪多嚼不烂,欲速则不达

  • 累计撰写 29 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Jetpack组件-五-Hilt的基本用法

慢行的骑兵
2021-09-29 / 0 评论 / 0 点赞 / 375 阅读 / 710 字
  • 建议先学习Dagger2,再来学习hilt;

一.Hilt特点

  • Hilt就是Android团队联系了Dagger2团队,一起开发出来的一个专门面向Android的依赖注入框架。
    相比于Dagger2,Hilt最明显的特征就是:1. 简单。2. 提供了Android专属的API;
  • Hilt做的优化包括:
    • 无需编写大量的Component代码
    • Scope也会与Component自动绑定
    • 预定义绑定,例如 Application与Activity
    • 预定义的限定符,例如@ApplicationContext与@ActivityContext
  • 支持java8

二.使用

1.配置

  • project的gradle添加:
buildscript {
    repositories {
        //...
    }
    dependencies {
        //...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
        //...
    }
}
  • module的gradle添加
apply plugin: 'dagger.hilt.android.plugin'

dependencies {
	implementation "com.google.dagger:hilt-android:2.28-alpha"
	annotationProcessor "com.google.dagger:hilt-android-compiler:2.28-alpha"
}    

2.基本使用

  • hilt的使用比dagger2的使用会少一个component,我们先看一下简单的使用;
  • 定义javabean
public class Person {
}
  • 定义module
//跟dagger2会的不同点,使用了InstallIn注解
//参数表示注入到哪类组件
@InstallIn(ActivityComponent.class)
@Module
public class BeanModule {
    @Provides
    public Person providePerson(){
        return new Person();
    }
}
  • 在MainActivity中使用(少些了不少代码)
@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {

    @Inject
    Person mPerson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        System.out.println("mPerson " + (mPerson == null));
    }
}
  • 此时,还没有结束,使用hilt需要在自定义的Application类中添加@HiltAndroidApp注解
@HiltAndroidApp
public class MyApplication extends Application {
}
  • 到此,hilt最简单的使用,已经使用;

3.hilt提供的组件

  • 关于@InstallIn注解的参数说明,其参数决定了注入器面向的对象,参数类型及其注入器对象的信息如下

01.hitl组件

  • 如果需要使用 FragmentComponent 中定义的绑定并且视图是 Fragment 的一部分,应将 @WithFragmentBindings 注释和 @AndroidEntryPoint 一起使用。了解即可,学习原则:由简单常用的开始;

4.hilt组件生命周期

02.组件生命周期

5.hilt组件作用域

03.组件作用域

6.接口的注入

  • 隔离层设计方案会使用到接口的注入
public interface DiInterface {
    void method();
}

public class DiInterfaceImpl implements DiInterface{

    @Inject
    public DiInterfaceImpl() {
    }

    @Override
    public void method() {
        Log.i("method","注入 success");
    }
}

@Module
@InstallIn(ActivityComponent.class)
public abstract class DiInterfaceImplModule {
    @Binds
    public abstract DiInterface bindInterImpl(DiInterfaceImpl diInterface);
}

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
    @Inject
    DiInterface mDiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mDiInterface.method();
    }
}

7.注意

  • 实现有使用gradle插件做字节码插桩
xxx\.gradle\caches\modules-2\files-2.1\com.google.dagger\hilt-android-gradle-plugin\2.28-alpha\eb33a043b2bbdc7cdee3c851d0f8532bfd3645a5\hilt-android-gradle-plugin-2.28-alpha-

二.隔离层设计

  • 简单理解就是,面向接口编程。然后,具体的实现通过注入的方式进行设置,该方案在项目中已经设计过,但是可以改用hilt,其有更多的好处;
    • 对象的创建和销毁 完全不需要处理 ;
0

评论区