0

我有一堂课:

class RenderView implements Runnable {
   Thread renderThread;
   public void  run() {
        while(!Thread.currentThread().isInterrupted()) {
            //does some work
        }
} 

//At some point in executed code, inside RenderView class (i'm sure it's executed)
renderThread = new Thread (this);

//When activity is closed (also, i'm sure this part is executed)
renderThread.interrupt();

并且 renderThread 真的停止了(至少 run() 方法退出了)。

但是由于某种原因,在我退出活动后,我的代码中仍然有一些对 renderView 的引用。这导致我出现巨大的内存泄漏。

一个 hprof 转储告诉我:java.lang.Thread(这个在 GC Root 中)有一个对目标的引用(mypackage.RenderView)

我不知道为什么这个 Thread 类保留对我的 Thread 的引用,即使我已经完成了 Thread!有任何想法吗?

编辑:在活动 B 中引用了 renderView。因此,当我退出活动时,应该仍然无法访问对 renderThread 的引用。但我仍然尝试设置 renderThread = null :不起作用。正如我能够通过 MAT Analyzer 发现的那样,使 renderView 不会被垃圾收集的唯一因素是来自 java.lang.Thread 的这个奇怪的引用。

MAT 分析仪截图

4

4 回答 4

2

为什么不直接使用 AsyncTask 或 runOnUIThread()?

我从来没有看到需要你做什么。也许有一个,否则只使用 AsyncTask 或 runOnUIThread。不要重新发明轮子。

于 2012-07-20T23:52:24.740 回答
1

释放你的线程实例

renderThread = null;

线程实例与任何其他实例一样,是一个对象。即使它完成运行,你也会保留对它的引用,直到你释放它。

于 2012-07-20T23:56:35.720 回答
0

您是否尝试过无效renderThread

于 2012-07-20T23:53:53.057 回答
0

实际上,renderThread.interrupt 可能不会停止线程,它只是设置一个标志和信号 JVM,它可以被中断。这就是为什么你的线程仍然在运行。最好的做法是通过设置一个优雅地退出 run 方法在while循环中标记。

    while(isRunning){

    }

// at some point, say 

    isRunning = false;

可以从以下链接获得有关 Android UI 设计的最佳实践。

安卓用户界面设计模式:

于 2012-07-21T03:29:20.670 回答