以下代码会导致内存泄漏吗? 假设该方法在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();
}
这会导致泄漏吗?由于线程引用在其外部创建的Object
由于 拉姆
答案 0 :(得分:0)
是的,线程不遵循Activity生命周期,因此如果您创建一个线程并且Runnable是一个匿名类,它将具有对Activity的隐式引用,因为java将创建一个内部类。
如果Activity方向发生变化或任何其他类型的配置更改,Android将销毁Activity并创建一个新的,但是,它不能被垃圾收集器解除分配,因为线程被认为是GC根,净效果是在你的线程结束之前,你将在内存中有2个活动。如果您的线程在配置更改之前结束,那么您可以,但不建议这样做,因为您通常无法保证这一点。
解决方案是将runnable声明为内部静态类或外部类,并且当配置更改发生时,您对Thread / Runnable中的活动的任何引用都会传递新活动的引用。 / p>