Утечка памяти Android в обработчике - PullRequest
0 голосов
/ 02 ноября 2018

Эта функция обновляет пользовательский прогресс с помощью значения счетчика, чтобы запускаться через 10 секунд, останавливаться на 0, а каждую миллисекунду обновлять прогресс, чтобы он был плавным. (обратите внимание, что updateProgress вызывает функцию invalidate ())

Если я использую обычный прогресс, все в порядке, у меня не было утечки памяти, но если я использую этот код, память в инспекторе «Android profiler» запускается с 60 Мб, но она увеличивается и не останавливается.

Мне нужно использовать пользовательский прогресс.

Есть ли лучший способ реализовать это?

private void testing(){
    count = 10000;
    final Handler handler = new Handler();
    final Runnable runnable = new Runnable() {
        public void run() {
            if (count > 0){
                updateProgress(count);
                handler.postDelayed(this, 1);
            }
            count--;
        }
    };
    handler.post(runnable);
}

1 Ответ

0 голосов
/ 02 ноября 2018

1. Использовать обработчик каждые 100 миллисекунд (лучше 1 секунда) вместо 1 миллисекунды

private void testing(){
    count = 10000;
    final Handler handler = new Handler();
    final Runnable runnable = new Runnable() {
        public void run() {
            if (count > 0){
                updateProgress(count);
                handler.postDelayed(this, 100); //100 millsecond
            }
            count--;
        }
    };
    handler.post(runnable);
}

2. Убедитесь, что вы удалили обратный вызов обработчика в onstop

@Override
protected void onStop() {
    super.onStop();
   handler.removeCallbacks(runnable);
}
...