【问题标题】:Android Memory Leak - Anonymous classAndroid 内存泄漏 - 匿名类
【发布时间】:2017-04-19 10:10:53
【问题描述】:

下面的代码会导致内存泄漏吗? 假设方法在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();
    }

这会导致泄漏吗?由于线程引用了在其外部创建的对象

谢谢 拉姆

【问题讨论】:

  • 这甚至不会编译......你不能再次分配给 final (更不用说 Runnable 实现中缺少方法和missig分号)
  • 为什么要这样做?为什么不把它放在 onDestroy()
  • 抱歉语法不正确。如果后台线程在活动销毁后仍在等待,现在它的行为如何。 (我知道如果对象是类的成员,那么活动肯定会泄漏)

标签: android memory-leaks


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 2017-01-06
    • 2015-12-28
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多