java - 在 java android 中使用 dagger2 在自定义/util 类中注入(inject) AndroidInjection 的位置

标签 java android class dagger-2

我正在使用 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) 行。但它没有任何onCreateonAttach 函数。那么如何在我的 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/

相关文章:

android - 适用于 Android 和移动设备的 TDD

android - 在不调用 set 方法的情况下设置字段的值 - Kotlin

python基础课问题,我哪里错了

java - 使用 Intent 启动 Activity 时遇到问题

java - Android Media Player SeekBar 不通过歌曲文件寻找

java - JTextField java?

java - RadioButton 无效双

android - 以编程方式创建位图掩码

python - 从类中删除 Canvas 对象时出现问题

java - Spring Listener Container - 事务管理器 - Spring Retry - 多个事务之间