java - 在 java android 中使用 dagger2 在自定义/实用程序类中注入 AndroidInjection 的位置
问题描述
我正在使用 dagger 2。并将我的依赖项注入到运行良好的活动和片段中。
AndroidInjection.inject(this)
对于里面的活动onCreate
。
// for the activity
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
AndroidSupportInjection.inject(this)
对于里面的碎片onAttach
。
// for fragments
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
现在我想在一个名为AsyncTaskHandler
. 我无法访问该依赖项。
我想我必须在AndroidInjection.inject(this)
某处添加行。但它没有任何onCreate
功能onAttach
。那么如何在我的 util 类中获取依赖项或如何调用该依赖项。
提前致谢。
解决方案
AndroidInjection 并不是为了帮助那些不是 Android 框架子类的类。相反,您应该执行以下操作之一:
在启用 DI 的类(Activity、Fragment 等,或它们注入的任何东西)中,注入 AsyncTaskHandler 或
Provider<AsyncTaskHandler>
通过带注释的@Inject
构造函数或字段。这将为您提供一个完全注入的 AsyncTaskHandler,而 Provider 将为您提供所需的数量(包括零)。这也允许您在不同的配置中替换 AsyncTaskHandler 或其工厂,或者在测试中替换 AsyncTaskHandler 实例。如果 AsyncTaskHandler 是您不需要替换的实现细节,即使在测试中,您也可以调用
new AsyncTaskHandler
. DI 的使用并不意味着每个类都被注入。当然,如果 AsyncTaskHandler 有很多依赖项,即使你不打算在任何配置中替换 AsyncTaskHandler 本身,也可以为了方便和可配置性而选择注入。如果即使没有封闭的 DI 环境也必须让 AsyncTaskHandler 自行注入,您可以制定自己的解决方案:确保 AsyncTaskHandler 可以访问 Application 实例,将其转换为允许注入的接口,然后使用成员注入法。您还可以选择将您的 Component 或 a 保存
MembersInjector<AsyncTaskHandler>
到某个静态字段中,并访问它以允许注入您的 AsyncTaskHandler — 可能将静态字段保留在 AsyncTaskHandler 本身上。您需要Application#onCreate
在创建 Component 实例的地方或任何地方执行此操作。在不依赖测试不友好的静态注入器的情况下从任意类实例获取应用程序实例的困难,或者确保在 AsyncTaskHandler 需要时使用 Component 或 MembersInjector 填充静态字段,这是 AndroidInjection 的部分原因限制其范围以排除此类用例。您需要确保其余代码的结构是安全的。
推荐阅读
- json - 将influxdb获取的数据转换为JSON
- python - 对相似或相同的数字进行分组或聚类,同时保持其完全相同的顺序
- python - Python 输入除英语以外的其他语言
- android - 请求中提供的重定向 uri 不在使用此客户端应用程序配置的有效 uri 列表中
- docker - Docker - 无效的参考格式
- assembly - 如何通过 Opcode Map 解释这条指令?
- javascript - JS 模块模式
- c# - 跨文件访问变量
- css - 我可以为我的网站的移动设备和标签等设备制作单独的 HTML 文件吗?
- c++ - 你如何称呼像字符串类型一样分布在整个代码库中的类型?