我知道可以用Dagger注入Context。我们可以看到示例here和here。
另一方面,有很多关于不在静态变量上放置上下文以避免泄漏的帖子。 Android Studio(lint)也对此感到温暖:
不要将Android上下文类放在静态字段中;这是一个 内存泄漏(也打破了Instant Run)
我理解通过使用Dagger注入Context,我们将它放在单例类上,因此上下文在某种程度上是静态的。这不符合棉绒警告吗?
注入上下文似乎创建了更清晰的代码,因为您不必将它传递给多个类(不需要它),以便他们可以进一步将其传递给其他需要它的类(由于某种原因)例如资源)。
我只是担心这可能会导致一些不希望的泄漏或以某种方式破坏棉绒。
答案 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不一定是静态参考。