TimerTask и Timer: поведение переменной экземпляра - PullRequest
0 голосов
/ 17 января 2019

В приведенном ниже коде, когда я меняю ориентацию устройства, я все еще получаю предыдущие значения переменной "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 голосов
/ 17 января 2019

Вы должны отменить таймер в onDestroy, позвонив timerTask.cancel();.

0 голосов
/ 17 января 2019

По существу, у вас есть утечка памяти, вызванная не отмененным предыдущим Timer и сохранением ссылки на переменную count. Вот почему, даже когда Activity уничтожается, ваш старый таймер все еще увеличивает старую переменную count, и когда активность воссоздается, появится новый объект Timer и новая переменная count. Поэтому вы увидите 2 счетчика одновременно.

Решение отменяет таймер при разрушении активности:

@Override
protected void onDestroy() {
    super.onDestroy();
    timer.cancel();
}

Если вы хотите узнать больше об утечках памяти, вы можете оформить эту статью.

0 голосов
/ 17 января 2019

откройте файл манифеста Android и измените тег активности следующим образом

android:configChanges="keyboardHidden|orientation"
...