Может ли добавление анонимных исполняемых модулей в очередь потока Handler вызвать утечку памяти?

Будет ли этот код вызывать утечку памяти, если он присутствует в компоненте Activity VS ViewModel?

    handlerThread = new HandlerThread("myHandlerThread");
    handlerThread.start();
    Handler handler = new Handler(handlerThread.getLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do work
        }
    }, 1000);

    @Override
protected void onDestroy() {
    super.onDestroy();
    handlerThread.quit();
}

Будет ли иметь какое-либо значение замена анонимного исполняемого класса статическим классом, расширяющим Runnable? Это упоминалось @4:13 в этом видеоруководстве!

Почему анонимный исполняемый файл содержит ссылку на Activity или ViewModel?




Ответы (1)


В Java нестатические внутренние и анонимные классы содержат неявную ссылку на свой внешний класс. С другой стороны, статические внутренние классы этого не делают.

Избегайте использования нестатических внутренних классов в действии, если экземпляры внутреннего класса могут пережить жизненный цикл действия. Вместо этого предпочтите статические внутренние классы и держите слабую ссылку на активность внутри.

Источник 1 Источник 2

Что касается выполнения того же самого в ViewModel вместо Activity, если произойдет утечка памяти, она будет иметь меньшую величину, если ViewModel не содержит ссылку на объекты с интенсивным использованием памяти, которые должны быть собраны мусором. Но, тем не менее, угроза утечки памяти все еще возможна.

Эта ссылка также очень информативна.

Этот плейлист содержит все о том, как правильно использовать Handlers/Threads/HandlerThreads

person Mena    schedule 28.12.2020