首页 > 解决方案 > 在 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 类中获取依赖项或如何调用该依赖项。

提前致谢。

标签: javaandroidclassdagger-2

解决方案


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 的部分原因限制其范围以排除此类用例。您需要确保其余代码的结构是安全的。


推荐阅读