java - 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 + " ***");
}
}
}
解决方案
基本上,你有内存泄漏,这是由于之前没有取消Timer
并保持对count
变量的引用引起的。这就是为什么即使 Activity 被销毁,您的旧计时器仍在增加旧的计数变量,并且随着活动的重新创建,将会有新的 Timer 对象和新的计数变量。因此,您将同时看到 2 个计数器。
解决方案是在销毁活动时取消计时器:
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
如果您想了解更多关于内存泄漏的信息,可以查看这篇文章。
推荐阅读
- javascript - 如何使用 iCheck 反转选择
- php - 如何搜索两个日期之间的记录。但表日期格式是 varchar
- makefile - GNU Make 未执行先决条件规则且未找到相关库
- window - SDL2 SDL_GetWindowSurface 返回未知像素格式的表面
- reactjs - 做出反应。在另一个地图中运行 .map 或 .filter
- visual-studio-code - 如何将 Anaconda 环境(Ubuntu Windows)与 VS Code 集成?
- python - 在 MatplotLib 中的折线图中更改和更改 x 和 y 轴的范围
- php - 非法字符串偏移“名称”错误
- javascript - JQuery AJAX - 引用的变量被覆盖
- c# - 在 Asp.net Core 中使用 Json 发送模型