当前位置: 首页 > 网络应用技术

Android依赖刀具库的使用

时间:2023-03-09 11:44:07 网络应用技术

  大多数时候,我们编写程序以通过新对象()创建对象。当需要在多个位置创建对象时,我们可能会被打包到工厂方法中。是否有更优雅的实现方法?我相信每个人都可以说一两个,但是很少有人会在Android方面使用它。以下是引入依赖性在注射中使用的一个小例子。我希望给您一点帮助。首先介绍接下来的两个名词。

  IOC(控制逆转):全名是控制的,这是一种思想。它指的是第三方控制以创建对象。

  DI(依赖注射):全名是依赖性注入。

  传统程序创建对象是由呼叫者通过OBJ OBJ = new OBJ()创建的,并且依赖注入是处理对象的创建和对象的管理周期对容器的管理周期来管理注释徽标,例如:@injectsOBJ OBJ,该容器将符合注释,它会自动为我们创建示例,并在程序中直接使用OBJ。

  例如

  当使用MVVM模式进行网络请求时,ViewModel依赖于存储库层,存储库依靠远程数据源和房间,首先忽略房间,然后将Mainapi视为远程数据源。下面我使用普通写作方法,通用反射写作方法和刀片写作。

  三种不同的写作方法已经完成。每个都有自己的优势和缺点。尽管握力写作高级,但在编译期间添加了许多类别。模块化开发需要在每个模块的构建中添加依赖项。使用Kotlin编写代码卷。为了促进阅读我的Java代码的示例。我个人出价反映了慷慨的实现。尽管在ViewModel中的创建不符合MVVM架构,但使用它也很方便。

  在介绍Hilt之前,让我们谈谈取决于Android注射的历史。Dagger于2012年由Square推出,并基于反思来实现。Later,Google是基于此基础重建的,即,Dagger2是根据Java注释来实现的,该错误将在编译期内检查。如果批准编译,则项目正常运行。它适用于Java和Kotlin.hilt是Google为Android编写的一组依赖注射框架。与Dagger2相比,简单易用,它提供了Android的独家API。

  必须添加到应用程序子类@hiltandroidapp

  向日葵这是Google Android的官方例子

  在使用依赖项注入框架之前,我们通过新的XXX()在代码中创建对象。该对象的创建过程实际上已移交给虚拟机身。我们不在乎它是如何创建的。注入依赖项后,将对象的创建移交给了握持控制。Hilt是如何创建它的?此时,还引入了一个概念:容器。

  该容器负责创建对象。我们不需要手动去新。您只需要在指定的位置添加不同的注释即可。选择刀柄内部的不同容器以帮助我们创建对象。我如何选择?它主要是通过@Installin(Container .Class)自己指定的。容器创建的物体的生命周期由刀柄确定。单个案例类是由一个容器创建的。ViewModel容器创建的对象的生命周期与ViewModel相同。活动中使用的对象是由活动容器创建的。不同容器创建的对象也不同。

  我应该被准确地称为组件。我喜欢容器,更受欢迎,哈哈。Below是官方图片。基于此,我添加了ViewModelComponent,以更全面。

  

  通过上图,我们必须了解以下几点:

  例如,上述代码:

  @hiltandroidapp的必要条件使刀柄生效。使用刀柄的模块必须在应用程序的子类@hiltandroidapp的子类中声明

  @installin对类名称作用,例如:@installin(singletoncomponent :: class),识别提供当前类创建的对象的识别由容器创建,并在下面使用示例用于下面的示例

  @Module在类名称上,通常与@installin一起使用。当前类是一个模块。该类中的方法将由指定的容器类创建。HALF用于创建:第三部分类,接口,构建模式的结构等与@installin同时使用,并指定由哪个容器创建的容器该模块。有关详细信息,请参阅下面的示例

  @singleton在方法上。该方法创建的对象是一种情况,此方法只能执行一次。有关详细信息,请参阅下面的示例

  @provides在方法上。标识符方法返回的对象是由容器创建的。在需要提供此类实例时,HILT会执行方法主题。有关详细信息,请参阅下面的示例。

  @androidrypoint在下面的分类类上作用,除了应用程序

  HILT共有6个入口点,即:应用活动片段片段视图服务broadcastreceiver

  除了@HiltAndroidApp的应用程序外,活动仅支持组件的子类。片段仅支持androidx下的碎片。其他入口点的子类是@androidentrypoint,例如:

  @ActivityScoped可以在类和方法上作用。

  scope1,scope2,scope3,scope4是相同的对象,因为@activityScoped()在过程中添加@ActivityScopsed,这表明只有在该方法创建的对象的生命周期中才能创建一次。scope3 == scope4

  UNSCOPE1,UNSCOPE2,UNSCOPE3和UNSCOPE4是4个不同的对象@provides。在方法方面,在创建对象时,容器会执行此方法。如果您不添加@provides,则容器创建对象将不会转到ProvesCopedBinding()方法。

  @viewModelsCoped@fragmentsCoped@viewScoped@servicescoped@xxscoped注释,可以在方法和类中定义。如果对象的创建是由容器创建的,即使在类上定义了@xxscoped注释,她也会被她忽略。如果它在类上定义,并且对象的创建不会穿过容器,则课堂上的@xxscoped注释将生效。

  @Inject使用@Inject告诉Hilt以创建此类示例。它通常用于结构,非私有场和非静态方法中。

  @entrypointhilt支持了6个入口点应用程序,活动,片段,视图,服务,广播点。

  @binds和@qualifier必须采取抽象方法,抽象方法必须返回

  请参见上面的@binds和@qualifier的示例

  定义@Installin注释时,请记住添加@Module,必须将@provides添加到创建第三方对象的方法中,并告诉HILT通过此方法而不是第三方的构造函数来创建对象。 @SingleScoped注释指示此方法仅执行一次,而创建的对象是一种情况。

  请参见上面的@binds和@qualifier的示例

  含义:注入的类可以默认为构造函数中不同对象的引用,并且根据当前的入口点分析其保留的对象。请参见示例。

  您也可以将应用程序转换为我们自己的myApplication

  只需将@HiltViewModel添加到ViewModel即可创建一个ViewModel。

  刀柄的常见用法基本上也完成。刀柄的引入还将默认引入匕首库。如果您想快速开始使用HILT,则必须首先了解创建刀柄容器对象的方法,每个注释的用法。使用多模块应用中的依赖项注入,并且必须使用匕首中的API来实现。目前,Hilt和Jetpack的集成仅支持ViewModel和Workmanager。我相信Google将来会提供更多的JetPack组件支持。

  链接:https://juejin.cn/post/6982847620255334437作者:路上的LX版权所有属于作者。