目录
- The problem I am trying to solve
- When does injecting happen
- Proving it with code
- TLDR(Too Long Didn't Read)
我在Google Playstore上的应用程序
github代码
简介
- 本系列将是对我在开发Android应用程序时面临的任何问题或任何观察结果的非正式演示。本系列中的每个博客文章都将是独特的,并且与其他博客文章是独一无二的,因此请随时环顾四周。
我试图解决的问题
- 所以我有这件代码需要与之互动:
@AndroidEntryPoint
class BillingService: Service() {
@Inject lateinit var billingClientWrapper: BillingClientWrapper
}
- 要与
billingClientWrapper
互动,我需要能够调用此方法:
billingClientWrapper.startBillingConnection(MutableLiveData(false))
- 问题是我不知道刀柄何时注射现场。但是,到本博客文章结束时,您和我都会知道何时注射刀片。
注射什么时候进行?
-
注射到Android服务时,重要的是我们使用现场注入。主要是因为Android系统会照顾服务的创建,并且不允许使用参数。
-
为了使用字段注射,刀柄必须知道如何创建类。如果我们拥有班级,则可以简单地用
@Inject constructor
注释构造函数。但是,如果我们不拥有班级,我们必须创建适当的刀柄模块 -
我也想指出一个事实,即用
@AndroidEntryPoint
注释该服务。不仅需要使用现场注入,而且@AndroidEntryPoint
为您的项目中的每个Android类生成一个单独的刀柄组件。这意味着用@AndroidEntryPoint
注释的任何类都将获得与之生成的特定握力组件。 -
如文档所述,
For each Android class in which you can perform field injection, there's an associated Hilt component
。如果我们可以查看THIS文档,我们可以在Service Ongreate()方法中生成ServiceComponent
(为服务类创建)。 -
这一切最终意味着,由于我们在使用
@AndroidEntryPoint
注释的服务类内使用@Inject
,这将发生:
1)Android系统创建服务
2)service otCreate()方法被称为
3)HILT创建ServiceComponent
4)Hilt使用ServiceComponent进行@Inject注释字段
证明它是
- 如果您想自己证明这一点,请尝试相同的代码,但使用INIT块,这样的代码:
@AndroidEntryPoint
class BillingService: Service() {
@Inject lateinit var billingClientWrapper: BillingClientWrapper
init{
billingClientWrapper.startBillingConnection(MutableLiveData(false))
}
}
- 初始创建
BillingService
和Service OnCreate()方法之前,init {}块被调用。如果您运行此代码或尝试在OnCreate()运行代码之前与服务内部的现场注入进行交互,则该代码将崩溃。
- 要使此代码运行正确,我们必须执行此操作:
override fun onCreate() {
super.onCreate()
billingClientWrapper.startBillingConnection(MutableLiveData(false))
}
- 由于在ongreate()期间注入@Inject,此代码将正常运行。
tldr(太长没有读)
- 使用THIS图表来确定何时注入字段
结论
- 感谢您抽出宝贵的时间阅读我的博客文章。如果您有任何疑问或疑虑,请在下面发表评论或在Twitter上与我联系。