在Java android中使用dagger2在自定义/ util类中注入AndroidInjection的位置

时间:2018-12-19 09:17:48

标签: java android class dagger-2

我正在使用匕首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)行。但它没有任何onCreateonAttach函数。因此,如何在我的util类中获取依赖关系或如何调用该依赖关系。

谢谢。

2 个答案:

答案 0 :(得分:4)

AndroidInjection并不旨在帮助不是Android框架子类的类。相反,您应该执行以下操作之一:

  • 在启用了DI的类(活动,片段等,或它们注入的任何东西)中,通过带有注释的Provider<AsyncTaskHandler>注入AsyncTaskHandler或@Inject。这将为您提供完全注入的AsyncTaskHandler,并且Provider将为您提供尽可能多的信息(包括零)。这还允许您以不同的配置替换AsyncTaskHandler或其工厂,或者在测试中替换AsyncTaskHandler实例。

  • 如果AsyncTaskHandler是不需要替换的实现细节,即使在测试中,也可以调用new AsyncTaskHandler。 DI的使用并不意味着每个类都被注入。当然,如果AsyncTaskHandler有很多依赖性,那么即使您不打算在任何配置中替换AsyncTaskHandler本身,也可以出于方便和可配置性的考虑而选择注入。

  • 如果即使没有封闭的DI环境,也必须让AsyncTaskHandler自身进行注入,则可以制定自己的解决方案:确保AsyncTaskHandler可以访问Application实例,并将其强制转换为一个允许注入的接口,然后使用members-injection method进行注入。您还可以选择将Component或MembersInjector<AsyncTaskHandler>保存到某个位置的静态字段中,并进行访问以允许注入AsyncTaskHandler-可能会将静态字段保留在AsyncTaskHandler本身上。无论您要在Application#onCreate还是在创建组件实例的任何地方进行此操作。

    从任意类实例中获取Application实例而不依赖于测试不友好的静态注入器的困难,或者确保在AsyncTaskHandler需要它的时候确保用Component或MembersInjector填充静态字段的困难是部分原因AndroidInjection的范围受到限制,以排除此类用例。您需要确保其余代码的结构是安全的。

答案 1 :(得分:1)

尝试类似这样的方法: 您可以注入基本应用程序或AppModule

@Provides
MyUtilClass provideMyUtilClass(Context context) {
    return new MyUtilClass(context)
}

以下是您要注入的虚拟util类:

public class MyUtilClass  {
    private Context context;

    public MyUtilsClass (Context context) {
        this.context = context
   }
   // more code
}

让我知道这是否有帮助