我正在使用 dagger 2。并将我的依赖项注入(inject)到运行良好的 Activity 和 fragment 中。
AndroidInjection.inject(this)
用于 onCreate
内的 Activity 。
// for the activity
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
AndroidSupportInjection.inject(this)
用于 onAttach
内的 fragment 。
// for fragments
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
现在我想在名为 AsyncTaskHandler
的自定义或实用类中注入(inject)相同的依赖项。我无法访问该依赖项。
我想我必须在某处添加 AndroidInjection.inject(this)
行。但它没有任何onCreate
或onAttach
函数。那么如何在我的 util 类中获取可访问的依赖项或如何调用该依赖项。
提前致谢。
最佳答案
AndroidInjection 并不意味着帮助处理不是 Android 框架子类的类。相反,您应该执行以下操作之一:
在您启用 DI 的类(Activity、Fragment 等,或它们注入(inject)的任何东西)中,注入(inject) AsyncTaskHandler 或
Provider<AsyncTaskHandler>
通过@Inject
- 带注释的构造函数或字段。这将为您提供一个完全注入(inject)的 AsyncTaskHandler,并且 Provider 将为您提供您可能需要的数量(包括零)。这还允许您在不同的配置中替换 AsyncTaskHandler 或其工厂,或者在测试中替换 AsyncTaskHandler 实例。如果 AsyncTaskHandler 是您不需要替换的实现细节,即使在测试中,您也可以调用
new AsyncTaskHandler
.使用 DI 并不意味着每个类都被注入(inject)。当然,如果 AsyncTaskHandler 有很多依赖,即使你不打算在任何配置中替换 AsyncTaskHandler 本身,为了方便和可配置性,你也可以选择注入(inject)。如果您必须让 AsyncTaskHandler 注入(inject)自身,即使没有封闭的 DI 环境,您可以制定自己的解决方案:确保 AsyncTaskHandler 可以访问 Application 实例,将其转换为一个允许注入(inject)的接口(interface),然后使用 members-injection method 注入(inject)它.您也可以选择保存您的组件或
MembersInjector<AsyncTaskHandler>
进入某处的静态字段,并访问它以允许注入(inject)您的 AsyncTaskHandler——可能将静态字段保留在 AsyncTaskHandler 本身上。您需要在Application#onCreate
上执行此操作或者在您创建组件实例的任何地方。在不依赖测试不友好的静态注入(inject)器的情况下从任意类实例获取 Application 实例的困难,或者确保在 AsyncTaskHandler 需要时用 Component 或 MembersInjector 填充静态字段的困难是部分原因AndroidInjection 的范围有限,无法排除此类用例。您需要确保其余代码的结构是安全的。
关于java - 在 java android 中使用 dagger2 在自定义/util 类中注入(inject) AndroidInjection 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53847990/