2020-08-25
有没有人狗av网站亚洲一本道2017 在 Android 和 Hilt 中限定作用域

将对象 A 的作用域限定到对象 B,指的是对象 B 的整个生命周期内始终持有相同的 A 实例。当涉及到 DI (依赖项注入) 时,限定对象 A 的作用域为一个容器,则意味着该容器在销毁之前始终提供相同的 A 实例。

https://developer.android.google.cn/training/dependency-injection/hilt-android#component-scopes

}

组件层次结构

更改系统设置后,您将获得一个新的 AnalyticsAdapter 和 MainActivity 实例

每次创建的 MyActivity都会持有一个 ActivityComponentDI 容器的新实例,在 Activity 被销毁之前,该实例将向 组件层次结构下的依赖项提供相同的 AnalyticsAdapter实例。

通过使用 ViewModel 或者 Hilt 中的 ActivityRetainedScope 注解,您可以在系统设置更改后获得相同的实例

Jetpack Navigation 库

不使用依赖项注入时,您可能有如下代码:

使用 Hilt 注入 ViewModel

在 Android 中,您不使用 DI 库也可以通过 Android Framework 来手动限定作用域。让我们看看如何手动限定作用域,以及如何改用 Hilt 来限定作用域。最后,我们将比较使用 Android Framework 手动限定作用域和使用 Hilt 限定作用域的区别。

NavGraph

通过这种方式,您将 AnalyticsAdapter的作用域限定为 ViewModel。因为 Activity 具有 ViewModel 的访问权限,所以在该 Activity 中可以始终获得相同的 AnalyticsAdapter实例。

使用 Hilt,等效代码如下:

对比 Hilt 及 ViewModel 限定作用域

@AndroidEntryPointclassExampleActivity: AppCompatActivity{

使用 Hilt 实现依赖项注入

classExampleActivity: AppCompatActivity{privatevalanalyticsAdapter = AnalyticsAdapter... } @ActivityScoped classAnalyticsAdapter@Injectconstructor{ ... } classAnalyticsAdapter{ ... } @ActivityRetainedScopedclassAnalyticsAdapter@Injectconstructor{ ... } classAnalyticsAdapter@Injectconstructor{ ... }

限定作用域会有一些代价,因为提供的对象在持有者被销毁之前将一直保留在内存中。请在应用中慎重地考虑使用限定作用域的对象。如果对象的内部状态要求使用同一实例,对象需要同步有没有人狗av网站亚洲一本道2017,或者对象的创建成本很高有没有人狗av网站亚洲一本道2017,那么限定作用域是恰当的做法。

文档 | 使用 Hilt 注入 ViewModel 对象

组件架构中的 ViewModel

https://developer.android.google.cn/guide/navigation/navigation-getting-started

classExampleViewModel: ViewModel { valanalyticsAdapter = AnalyticsAdapter }

analyticsAdapter变量的作用域被限定为 MyActivity的生命周期有没有人狗av网站亚洲一本道2017,这意味着只要 Activity 没有被销毁有没有人狗av网站亚洲一本道2017,该变量就是同一个实例。如果另一个类出于某种原因需要访问这个被限定了作用域的变量有没有人狗av网站亚洲一本道2017,每次访问也会获得相同实例。当新的 MyActivity实例被创建时 (如系统设置改变)有没有人狗av网站亚洲一本道2017,一个新的 AnalyticsAdapter实例将会被创建。

为此有没有人狗av网站亚洲一本道2017,您可以使用 组件架构中的 ViewModel有没有人狗av网站亚洲一本道2017,因为它可以在系统设置更改后留存。

然而有没有人狗av网站亚洲一本道2017,我们可能希望 AnalyticsAdapter可以在系统设置更改后留存!或者说有没有人狗av网站亚洲一本道2017,我们希望直到用户离开 Activity 之前有没有人狗av网站亚洲一本道2017,都限定该实例的作用域为 Activity。

当然有没有人狗av网站亚洲一本道2017,当您需要限定作用域时有没有人狗av网站亚洲一本道2017,您可以使用 Hilt 中的作用域注解有没有人狗av网站亚洲一本道2017,也可以直接使用 Android Framework。

使用 Hilt 限定作用域有没有人狗av网站亚洲一本道2017,优势为您可在 Hilt 组件层次结构中使用被限定的类型;而对于 ViewModel,则必须通过 ViewModel 手动访问被限定作用域的类型。

如上文所述,您可以使用 @ ViewModelInject向 ViewModel 注入依赖项。其原理是这些绑定关系保存在 ActivityRetainedComponent中,这也是为什么您只能注入未限定作用域的类型,或者是限定作用域为 ActivityRetainedComponent以及 ApplicationComponent的类型。

classExampleViewModel@ViewModelInjectconstructor( privatevalanalyticsAdapter: AnalyticsAdapter ) : ViewModel { ... }

全部可用作用域

https://developer.android.google.cn/reference/androidx/lifecycle/LifecycleOwner

通过使用 Hilt,您可以通过限定 AnalyticsAdapter的作用域为 ActivityRetainedComponent来实现相同的行为,因为 ActivityRetainedComponent也可以在系统设置更改后留存。

在 Android 中限定作用域

看了上文的定义,您可能会有这样的异议: 在某个特定类中使用一个类型的实例变量也可以做到限定该变量类型的作用域。没错!不使用 DI 时,您可以执行如下操作:

原标题:在 Android 和 Hilt 中限定作用域

组件层次结构

https://developer.android.google.cn/training/dependency-injection/hilt-android#component-hierarchy

使用 ViewModel 限定作用域,优势为您可以在应用中任何 LifecyclerOwner 对象中持有 ViewModel。例如,如果您使用了 Jetpack Navigation 库,则可以将 ViewModel 绑定到 NavGraph上。

privatevalviewModel: ExampleViewModel byviewModels privatevalanalyticsAdapter = viewModel.analyticsAdapter

}

}

如果 Activity 或 Fragment 被 @AndroidEntryPoint注解修饰,就可以通过 getDefaultViewModelProviderFactory方法获取 Hilt 生成的 ViewModel 工厂了。由于可以在 ViewModelProvider中使用这些 ViewModel 工厂,使您获取 ViewModel 的方式变得更加灵活。例如: 将作用域限定为 BackStackEntry的 ViewModel。

@InjectlateinitvaranalyticsAdapter: AnalyticsAdapter

https://developer.android.google.cn/topic/libraries/architecture/viewmodel

LifecyclerOwner

Hilt 提供的作用域数量有限。可能没有符合您特定使用场景的作用域。例如嵌套 Fragment,对于这种情况,您可以退一步使用 ViewModel 限定作用域。

@AndroidEntryPointclassExampleActivity: AppCompatActivity{

@InjectlateinitvaranalyticsAdapter: AnalyticsAdapter

privatevalviewModel: ExampleViewModel byviewModels privatevalanalyticsAdapter = viewModel.analyticsAdapter

}

classExampleActivity: AppCompatActivity{

https://developer.android.google.cn/training/dependency-injection/hilt-jetpack#viewmodels

注意: 默认情况下,Hilt 中的绑定都 未限定作用域。这些绑定不属于任何组件,并且可以在整个项目中被访问。每次被请求都会提供该类型的不同实例。当您将绑定的作用域限定为某个组件时,它会限制您使用该绑定的范围以及该类型可以具有的依赖项。

如果您希望在遵循良好的 DI 实践的同时,保留 ViewModel 用于处理视图逻辑,您可以使用 @ViewModelInject 提供 ViewModel 的依赖项,该注解的详细描述请参见: 文档 | 使用 Hilt 注入 ViewModel 对象。这样一来, AnalyticsAdapter的作用域就无需被限定为 ActivityRetainedComponent,因为此时它的作用域被手动限定为 ViewModel:

在 Hilt 中,您可以通过注解将类型的作用域限定在某些容器或组件内。例如,您的应用中有一个处理登录和注销的 UserManager类型。您可以使用 @Singleton注解将该类型的作用域限定为 ApplicationComponent( ApplicationComponent是一个被整个应用的生命周期管理的容器)。被限定作用域的类型在应用组件中沿 组件层次结构向下传递: 在本案例中,相同的 UserManager实例将被提供给层次结构内其余的 Hilt 组件。应用中任何依赖于 UserManager的类型都将获得相同的实例。

@AndroidEntryPointclassExampleActivity: AppCompatActivity{

通过 ViewModel 限定作用域

我们刚才所看到的内容,可以应用到任何由 Android Framework 生命周期类管理的 Hilt 组件中。点击查看 全部可用作用域。回到我们最初的示例,将作用域限定为 ApplicationComponent,等同于不使用 DI 框架时在 Application 类中持有该实例。

https://developer.android.google.cn/training/dependency-injection/hilt-android#component-hierarchy

https://developer.android.google.cn/reference/androidx/navigation/fragment/NavHostFragment

当前位置: > 其他 > 正文

原标题:从过度吸烟到心梗发作,只有三步,看看您处在哪一步,请及时刹车

近日在在腾讯视频上线的电竞题材电视剧《穿越火线》意外爆红。

原标题:[公司]古鳌科技2020年上半年营收9821.25万元 同比增长4.54%

原标题:谢霆锋深情唱《传奇》,既是致敬导师李建,更是隔空向王菲表白

原标题:刘诗诗穿粉色长裙被嘲廉价,靠气质撑造型,坐姿优雅天鹅颈优越

《乘风破浪的姐姐》第五次公演以宁静团成绩垫底落幕,结局是白冰和黄圣依惨遭淘汰,阿朵和孟佳成功补位。

据央视新闻客户端消息 据美国当地媒体报道,当地时间8月21日,美国女演员罗莉·洛夫林及其丈夫莫西莫·吉安诺里因名校招生舞弊案被分别判处入狱两个月和五个月。同时,洛夫林获得假释两年,在此期间,她必须执行100小时的社区服务,并支付15万美元的罚款。她的丈夫吉安诺里被罚款25万美元,假释两年,并进行250小时社区服务。两人都必须在11月19日下午2时之前向美国监狱管理局报到。

原标题:9月星座运势大公开,水瓶座人气旺盛、双鱼座以和为贵

原标题:孩子性早熟竟因吃得太好!父母看到后赶紧控制孩子饮食了!

原标题:警示丨银川一男子酒后破坏共享单车,拘留、罚款!

原标题:《正大综艺》主持王雪纯罕露面,24岁进央视被嘲关系户全靠父母?

新京报讯 (记者 秦胜南)8月19日23时许,对特斯拉声明“武汉车主提车造假”的说法,宜买车在官方微博发布官方说明,还原协助武汉车主提车的全过程,出示的购车发票显示为8月18日付款。宜买车称“车子是全新的,发票也是真的”,将保留对造谣者追究法律责任的权利。

新京报贝壳财经讯(记者 潘亦纯)国家企业信用信息公示系统显示,蚂蚁科技集团股份有限公司(以下简称:蚂蚁集团)8月21日变更了一起“高级管理人员备案”事项,张勇、彭蕾、武卫已不在公司董事之列,而新增了程立、郝荃、黄益平、胡祖六、蒋芳5位新董事。