We know匿名类维护对其封闭实例的引用,这可能导致Android上下文泄漏。
由于retrolambda将lambda迁移到Java7,因此值得一试。
It seems Java8 lambdas没有这个问题,但是我找不到任何官方信息。
有任何线索吗?
答案 0 :(得分:18)
Lambda表达式和方法引用仅在需要时捕获对this
的引用,即直接引用this
或访问实例(非static
)成员时。
当然,如果你的lambda表达式捕获局部变量的值,并且该值包含对this
的引用,那么它意味着引用this
......
答案 1 :(得分:15)
以下是一些信息。
从以下链接http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: 这对内存管理有一个有益的含义:虽然内部类实例总是对其封闭实例有强引用,但是不从封闭实例捕获成员的lambda不保存对它的引用。内部类实例的这种特性通常可能是内存泄漏的来源(所谓的失效监听器问题)
您还可以看到http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html 来自文字: 嵌套类:如果您的要求与本地类的要求类似,您希望使类型更广泛可用,并且您不需要访问本地变量或方法参数。
如果您需要访问封闭实例的非公共字段和方法,请使用非静态嵌套类(或内部类)。如果您不需要此访问权限,请使用静态嵌套类。