首页 > 解决方案 > TimerTask 和 Timer:实例变量的行为

问题描述

在下面的代码中,当我改变设备的方向时,我仍然得到变量“count”的先前值,以及“count”的新计数器,我能从这种行为中得到什么?TimerTask 是否持有“count”变量的引用?

public class MainActivity extends AppCompatActivity {

private int count;
private TimerTask timerTask;
private Timer timer;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    timerTask = new MyTimerTask();
    timer = new Timer(true);
    //running timer task as daemon thread
    timer.scheduleAtFixedRate(timerTask, 0, 1000);
 }

 class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        count++;
        System.out.println("*** " + count + " ***");
    }
 }
}

在此处输入图像描述

标签: javaandroidandroid-lifecycletimertask

解决方案


基本上,你有内存泄漏,这是由于之前没有取消Timer并保持对count变量的引用引起的。这就是为什么即使 Activity 被销毁,您的旧计时器仍在增加旧的计数变量,并且随着活动的重新创建,将会有新的 Timer 对象和新的计数变量。因此,您将同时看到 2 个计数器。

解决方案是在销毁活动时取消计时器:

@Override
protected void onDestroy() {
    super.onDestroy();
    timer.cancel();
}

如果您想了解更多关于内存泄漏的信息,可以查看这篇文章。


推荐阅读