Android内存泄漏 - 匿名类

时间:2017-04-19 10:10:53

标签: android memory-leaks

以下代码会导致内存泄漏吗? 假设该方法在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

由于 拉姆

1 个答案:

答案 0 :(得分:0)

是的,线程不遵循Activity生命周期,因此如果您创建一个线程并且Runnable是一个匿名类,它将具有对Activity的隐式引用,因为java将创建一个内部类。

如果Activity方向发生变化或任何其他类型的配置更改,Android将销毁Activity并创建一个新的,但是,它不能被垃圾收集器解除分配,因为线程被认为是GC根,净效果是在你的线程结束之前,你将在内存中有2个活动。如果您的线程在配置更改之前结束,那么您可以,但不建议这样做,因为您通常无法保证这一点。

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