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 文章。