下面的代码会导致内存泄漏吗?假设方法在Activity中
public void main(){
final Object obj = new Object();
Runnable run = new Runnable() {
@Override
public void run() {
Thread.sleep(25000);//sleep
obj.hashCode();//do something
}
};
new Thread(run).start();
}
这会导致泄漏吗?由于线程引用在其外部创建的对象
谢谢拉姆
是的,线程不遵循 Activity 生命周期,因此如果您创建一个线程并且 Runnable 是一个匿名类,它将具有对 Activity 的隐式引用,因为 java 将创建一个内部类。
如果 Activity 方向更改或任何其他类型的配置更改 Android 将销毁 Activity 并创建一个新的 Activity,但是,垃圾收集器无法将其释放,因为线程被视为 GC 根,最终效果是您将拥有内存中的 2 个活动,直到您的线程结束。如果您的线程在配置更改之前结束,您就可以了,但这不是推荐的做法,因为您通常无法保证这一点。
一个解决方案是将 runnable 声明为内部静态类或外部类,并且当发生配置更改时,对您在 Thread/Runnable 中拥有的活动的任何引用都会传递新活动的引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句