это утечка памяти при просмотре? - PullRequest
0 голосов
/ 04 июня 2019

это утечка прикрепить замыкание к textView? countdownTextView - это getViewById () и часть представления макета. Когда

void postCountDownTimer(Long countDownTime, LinearLayout countdownContainer, TextView countdownTextView) {
    if (countDownTime >= System.currentTimeMillis()) {
        countdownTextView.postDelayed(new Runnable() {
            @Override
            public void run() {
                postCountDownTimer(countDownTime, countdownContainer, countdownTextView);
            }
        }, COUNTDOWN_DELAY_MILLIS);
    }

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы должны использовать Handler() для этого случая, так как это приведет к утечке памяти в зависимости от того, что вы пытаетесь сделать. postDelayed вставит в очередь, и когда контекст будет разрушен, очередь останется позади.

сделать что-то вроде:

private Handler mHandler = new Handler();

void postCountDownTimer(Long countDownTime, LinearLayout countdownContainer, TextView countdownTextView) {
     if (countDownTime >= System.currentTimeMillis()) {
         mHandler.postDelayed(new Runnable() {
             @Override
             public void run() {
                  mHandler.postDelayed(this, COUNTDOWN_DELAY_MILLIS);
             }
         }, COUNTDOWN_DELAY_MILLIS);
     }
}

//then on somewhere when your context gets destroyed, perform the call below:
mHandler.removeCallbacksAndMessages(null);
1 голос
/ 04 июня 2019

Да, это так.Пока countDownTime> = System.currentTimeMillis () имеет значение true, он будет постоянно публиковать сообщения в обработчик в потоке пользовательского интерфейса.Это будет сохранять ссылку на countdownTextView и countdownContainer до тех пор, пока эта функция не будет вызвана и условие не оценивается как ложное.Вы действительно хотите сделать это с помощью своего собственного обработчика, поэтому вы можете удалить все сообщения либо в onStop, либо в onDestroy (желательно в onStop, чтобы ваш пользовательский интерфейс не пытался обновляться при подключении к нему), а также удалить ссылки, чтобы он не просочился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...