TimerTask和Timer:实例变量的行为

时间:2019-01-17 10:06:58

标签: java android android-lifecycle timertask

在下面的代码中,当我更改设备的方向时,我仍在获取变量“ 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 + " ***");
    }
 }
}

enter image description here

3 个答案:

答案 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"