刀柄注射场注射何时注射
#kotlin #android #mobile #tristan

目录

  1. The problem I am trying to solve
  2. When does injecting happen
  3. Proving it with code
  4. 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上与我联系。