android - Dagger 组件是否绑定到实例化它的对象?
问题描述
我一直在我的项目中使用 Dagger 2。我知道作用域对象的生命周期与组件的生命周期相同(具有相同的作用域)。那么组件的寿命呢?
例如,我有一个组件:
@MyApp
@Component(modules = {
ApplicationModule.class})
public interface ApplicationComponent {
// Injection methods
void inject(MyApplication mainApplication);
}
我通过以下方式构建组件:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
buildApplicationComponent();
mApplicationComponent.inject(this);
}
private void buildApplicationComponent() {
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}
}
目前,构建组件的代码在Application
类中。但是,如果我在其中构建组件Fragment
将ApplicationComponent
具有与片段相同的生命周期并且如果我在Application
类中执行它,那么组件将具有与整个应用程序相同的生命周期吗?或者如何定义组件的生命周期?
解决方案
它是纯Java。无论在哪里,你都有对象。该对象为您提供依赖项。如果您使用相同的实例,您将具有相同的依赖项或基本相同的“范围/生命周期”。如果您在某处创建新对象,则意味着它可以提供新的其他对象\依赖项,以便“另一个范围/生命周期”。如果您在不同对象之间共享对象(您在 Application 类中创建它,但在另一个片段中重用它),您将处于“相同的范围/生命周期”中。
但总的来说,我在这里只看到使用 Dagger 2 的“旧方式”。这就是你的课程应该如何在任何地方结束。无需查找对任何组件等的引用,也无需尝试自行实例化它们或在 Fragments 或 Actvities 中自行清除它们。你在一个地方有一些 Dagger 2 的代码,然后你的类中有一些注释“它们可以完成你的项目的真正工作”。这两个部分之间不需要复杂的“连接”,我在这里看到很多这样的案例,这些案例是可追溯到 2016-2017 年的教程的一部分......
class Repostory @Inject constructor(
private val dependency1: Dependency1
) {}
class Activity or Fragment {
@Inject lateinit var dependency2: Dependency2
}
这是正确使用 Dagger2 的一个很好的例子。
https://github.com/google/iosched
这是一篇关于该应用程序的文章:
https://medium.com/@JoseAlcerreca
Jose Alcerreca 是负责制定 Android 应用程序编写指南的 Google Lead Devs 之一。
@Module
abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(modules = [MainActivityModule::class])
internal abstract fun mainActivity(): MainActivity
}
试着编译这样的东西。我给你的应用程序中有完全相同的课程。检查生成的代码以及文档。如果你看到 ContributesAndroidInjector 有解释:
为此方法的返回类型生成一个 {@link AndroidInjector}。注入器是用 {@link dagger.Subcomponent} 实现的,将是 {@link dagger.Module} 组件的子组件。
如果您查看 AndroidInjector 文档,您会看到它是在 Activity 中注入的那个。这将是实现:
@Subcomponent(modules = {MainActivityModule.class})
@ActivityScoped
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
所以一般来说,当一个新的活动开始时,这些注释会为你带来魔力。他们创建子组件,他们使用它,当活动生命周期结束时,子组件也死了。Dagger 清除引用。Dagger 知道 Activity 或 Fragments 等是如何工作的。当您在 Activity 中创建组件、使用它、自己调用注入时,有一种旧方法。或者在 AppClass 中放置一些组件,然后在你的 onw 上清除它。但是现在有更多的注释。
推荐阅读
- javascript - Firefox 的 Math.round 或 Date 是否不同?
- javascript - 当我有五个具有相同选项和值的选择时,如何从另一个选择标签中删除选定的选项?
- google-tag-manager - 我可以在多个标签中拆分 Google Tag Manager 促销视图吗
- javascript - 如何检查环境是否支持扩展构建,如 Array
- python - tkinter:在父级中显示的顶层框架
- python - 将工作 Python 脚本转换为 EXE (Python) 后出错
- smarty - 使用 first 和 last 属性时,为什么我的嵌套 IF 在 Smarty 中不起作用?
- javascript - 为什么 setTimeout 函数最后执行?
- oauth - OpenID 与 OAuth
- php - PHP中的FTP被动模式