public class MainActivity extends appCompatActivity{
private void taskDone()
{
System.out.print("done");
}
public void startBackgroundThread()
{
new Thread()
{
@Override
public void run()
{
MyLongrunnigTas.perform();
taskDone();
}
}.start();
}
//...
当调用startBackgroundThread()时,即使该活动被破坏(例如,由于方向改变),在线程执行后是否仍将被垃圾回收。
否则会导致内存泄漏吗?
答案 0 :(得分:2)
将根据正常规则对线程进行垃圾回收-当不再有GC根引用该线程时,将对其进行垃圾回收。由于正在运行的线程自动是GC根本身,因此直到线程完成运行后才可以收集该线程。它是否易懂取决于是否有其他变量对其进行引用。在您的示例中,它没有保存在任何地方,直到线程完成,它才符合条件。
对于Activity,由于Thread是一个匿名内部类,因此它将引用其在MainActivity中定义的类。因此,在线程完成运行MainActivity及其所有变量之前,将不会进行垃圾回收。这包括整个View层次结构,因此泄漏很严重。