在下面的代码中,当我更改设备的方向时,我仍在获取变量“ 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 + " ***");
}
}
}
答案 0 :(得分:2)
基本上,那里的内存泄漏是由先前的Timer
未被取消并继续引用count
变量引起的。这就是为什么即使Activity被销毁,您的旧计时器仍会增加旧的count变量,并且随着活动的重新创建,将会有新的Timer对象和新的count变量。因此,您会同时看到2个计数器。
当活动被破坏时,解决方案正在取消计时器:
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
如果您想了解有关内存泄漏的更多信息,可以查看this文章。
答案 1 :(得分:0)
您必须通过调用onDestroy
来取消timerTask.cancel();
中的计时器。
答案 2 :(得分:-1)
打开您的android清单文件,并按以下所示更改Activity标签
android:configChanges="keyboardHidden|orientation"