我正在使用匕首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类中获取依赖关系或如何调用该依赖关系。
谢谢。
答案 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
}
让我知道这是否有帮助