应该用Dagger注入上下文吗?

时间:2017-06-04 18:58:05

标签: android dagger-2

我知道可以用Dagger注入Context。我们可以看到示例herehere

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

  

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如果您了解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不一定是静态参考。