草庐IT

android - Dagger 2 组件、模块和范围的生命周期

coder 2023-06-05 原文

我已经阅读了很多关于 Dagger 2 的帖子和教程:

http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/

https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/

https://github.com/konmik/konmik.github.io/wiki/Snorkeling-with-Dagger-2

What determines the lifecycle of a component (object graph) in Dagger 2?

等等

但我仍然对组件的生命周期以及它与模块和范围的关系感到困惑。当我只想要一个单例时,我想确保不会创建一个对象的多个实例。希望有人能对这些有所了解:

应用程序类中构建的组件的生命周期是什么?

在 Activity 或 Fragment 类中构建的组件的生命周期是什么?

如果我想要来自组件的单例实例,我是否必须使用 @Singleton 或自定义范围注释组件并在应用程序类中构建该组件?

如果我在应用程序类中构建一个组件,这是否意味着通过该组件可用的所有对象实例都将是整个应用程序中的单例实例,直到应用程序被杀死或重新启动?

我有一个自定义范围的组件,比如说@ActivityScope,我在一个 Activity 中构建该组件,通过该组件注入(inject)的对象实例会在调用该 Activity 的 onDestroy() 后自动销毁吗?

再次,我有一个具有自定义范围的组件,比如说@ActivityScope,我在 ActivityA 和 ActivityB 中构建这个组件,ActivityA 和 ActivityB 将共享来自该组件的相同对象实例,或者它们将拥有自己的相同对象实例?

最佳答案

我是怎么理解的:

请记住两件事(当我第一次阅读 1 时)它让我觉得一切都变得更干净了):

1)只要您希望它或创建组件的类没有被破坏(如 android Activity 或 fragment ),组件就会一直存在

2)如果您不注解,则提供带有注解的方法(必须与组件注解相同),每次请求时都会创建新对象

What's the lifecycle of a component that's built in the application class?

应用程序类中内置的组件可以随心所欲地存在。我的意思是您可以随时创建它并随时删除它,只要您在扩展 android Application 类的类中创建它(这样,只要您的 Android 应用程序正在运行,组件对象就会一直存在)与构建的组件相反在 Activity 类中 - 只要 Activity 还活着,它就会一直存在,因此它可能会在例如方向改变时被破坏。 请记住,如果由于某种原因您没有在 Application 类的 onCreate() 方法中创建 ApplicationComponent(例如,您稍后在发生某些事情时创建了它),当 Android 操作系统内存不足和用户不足时,它可能会被销毁(无效)关闭您的应用程序,然后当用户返回您的应用程序(到最后一个可见 Activity )时,它已被早些时候杀死,您要求您的应用程序组件做某事然后检查它是否不为空

What's the lifecycle of a component that's built in the Activity or Fragment class?

我在上面的答案中部分回答了它。如果你在 Fragment/Activity 中创建你的组件,只要你想要,或者只要 Activity 或 Fragment 没有因为方向改变或内存不足而被破坏,它就会一直存在

If I want a singleton instance from a component, do I must annotate the component with @Singleton or a custom made scope and build that component in the application class?

这取决于你想在哪里使用这个单例。如果您想在单个 Activity 中使用单例,您可以创建例如 @ActivityScope 注释并使用此注释注释提供方法和 ActivityComponent,然后您在 onCreate() Activity 方法中创建您的 ActivityComponent 并且只要您的 Activity 存在,您就有一个单例(它可能如果您计划在同一 Activity 的不同 fragment 之间共享一个单例,这会很有帮助)。 如果您希望应用程序中不同 Activity/fragment 之间的单例,最好的方法是在 AppModule 中创建它,并使用单例注释注释提供方法和应用程序组件。

If I build a component in the application class, does that mean all the object instances available through this component will be a singleton instance throughout the app until the app is killed or restarted?

如果您使用 @Singleton 注释来注释提供方法,那么是的

I have a component with a custom scope let's say @ActivityScope, and I build that component in an Activity, will the object instances injected through this component be destroyed automatically after this activity's onDestroy() is called?

是的

Again I have a component with a custom scope let's say @ActivityScope, and I build this component in ActivityA and ActivityB, will ActivityA and ActivityB share the same object instances from this component or they will have their own instances of the same object?

他们会有自己的实例

关于android - Dagger 2 组件、模块和范围的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37848563/

有关android - Dagger 2 组件、模块和范围的生命周期的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  7. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  8. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

随机推荐