TimerTask 和 Timer:实例变量的行为
TimerTask and Timer: behaviour of instance variable
在下面的代码中,当我改变设备的方向时,我仍然得到变量 "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 + " ***");
}
}
}
打开您的 android 清单文件并按以下方式更改 Activity 标签
android:configChanges="keyboardHidden|orientation"
您必须通过调用 timerTask.cancel();
来取消 onDestroy
中的计时器。
基本上,由于未取消之前的 Timer
并保持对 count
变量的引用,导致内存泄漏。这就是为什么即使 Activity 被销毁,您的旧计时器仍在增加旧的计数变量,并且随着 activity 的重新创建,将会有新的 Timer 对象和新的计数变量。因此,您会同时看到 2 个计数器。
解决方案是在 activity 被销毁时取消计时器:
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
如果您想阅读有关内存泄漏的更多信息,可以查看 this 文章。
在下面的代码中,当我改变设备的方向时,我仍然得到变量 "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 + " ***");
}
}
}
打开您的 android 清单文件并按以下方式更改 Activity 标签
android:configChanges="keyboardHidden|orientation"
您必须通过调用 timerTask.cancel();
来取消 onDestroy
中的计时器。
基本上,由于未取消之前的 Timer
并保持对 count
变量的引用,导致内存泄漏。这就是为什么即使 Activity 被销毁,您的旧计时器仍在增加旧的计数变量,并且随着 activity 的重新创建,将会有新的 Timer 对象和新的计数变量。因此,您会同时看到 2 个计数器。
解决方案是在 activity 被销毁时取消计时器:
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
如果您想阅读有关内存泄漏的更多信息,可以查看 this 文章。