繁体   English   中英

应该用Dagger注入上下文吗?

[英]Should Context be injected with Dagger?

我知道可以用Dagger注入Context。 我们可以在这里这里看到例子。

另一方面,有很多关于不在静态变量上放置上下文以避免泄漏的帖子。 Android Studio(lint)也对此感到温暖:

不要将Android上下文类放在静态字段中; 这是内存泄漏(也打破了Instant Run)

我理解通过使用Dagger注入Context,我们将它放在单例类上,因此上下文在某种程度上是静态的。 这不符合棉绒警告吗?

注入上下文似乎创建了更清晰的代码,因为您不必将它传递给几个类(不需要它),以便他们可以进一步将它传递给其他需要它的类(由于某种原因)(获取资源)实例)。

我只是担心这可能会导致一些不希望的泄漏或以某种方式破坏棉绒。

您永远不应该存储/引用活动上下文(活动是上下文)的时间超过活动的生命周期,否则,正如您所说,您的应用程序将泄漏内存。 另一方面,应用程序上下文具有应用程序的生命周期,因此在单例中存储/引用是安全的。 通过context.getApplicationContext()访问应用程序上下文。

如果您了解Android生命周期并且小心区分应用程序上下文和活动和服务的上下文,则使用Dagger 2注入Context时没有错误。

如果您担心内存泄漏的可能性,可以使用断言来防止注入错误的上下文:

public class MyActivityHelper {
     private final Context context;

     @Inject
     public MyActivityHelper (Context context) {
         if (context instanceof Application) {
              throw new IllegalArgumentExecption("MyActivityHelper requires an Activity context");
         }
     }
}

或者,您可以使用Dagger 2限定符来区分这两者,这样您就不会意外地注入需要活动上下文的应用上下文。 然后你的构造函数看起来像这样:

@Inject
public class MyActivityHelper (@Named("activity") Context context) {

另请注意,根据David的评论,Dagger 2 @Singelton不一定是静态参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM