2017-04-19 17 views
0

下面的代码会导致内存泄漏吗? 假设该方法处于活动状态Android内存泄露 - 匿名类

 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(); 
    } 

这是否会导致泄漏?由于线程是指其上创建对象外面

感谢 拉姆

+2

这甚至不会编译......你不能再次分配给最终的(不提及Runnable实现中缺少方法和错误分号) – Selvin

+0

为什么你必须这样做?为什么不把它放在onDestroy() – Sattar

+0

对不正确的语法。如果后台线程在活动破坏后仍然在等待,现在它的行为如何。 (我知道如果Object是类的成员,那么活动肯定会泄漏) –

回答

0

是的,线程不遵循活动的生命周期,因此,如果您创建一个线程和了Runnable是一个匿名类将有一个隐式引用该Activity,因为Java将创建一个内部类。

如果活动方向更改或任何其他类型的配置更改,Android将销毁该活动并创建一个新的活动,但由于线程被视为GC根,因此无法由垃圾收集器解除分配,净效应是在线程结束之前,你将在内存中进行2个活动。如果你的线程在配置更改之前结束,那么你确定,但这不是建议的做法,因为你通常不能保证。

一种解决方案是将可运行内容声明为内部静态类或外部类,并且当配置更改发生时,您对Thread/Runnable中的活动的任何引用都会传递新活动的引用。