Считается ли наличие `ExecutorService` без явного` shutdown () `в приложении Android утечкой? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть несколько экземпляров Activity, которые должны выполнить какое-то действие (в основном, выделить / освободить какой-то тяжелый ресурс) упорядоченным способом. Поэтому я хотел бы иметь переменную области приложения (ExecutorService с одним потоком для более подробного ограничения потока).

Поскольку область действия Android отсутствует (только Activity / Fragment / Видать) немного сложно найти, в какой момент ExecutorService.shutdown() должен быть вызван. В настоящее время я mimi c подсчет ссылок (retain() + release() со счетчиком внутри), и это больно и имеет некоторые недостатки (например, retain() может следовать release() почти сразу, поэтому я бы предпочел иметь некоторую инерцию («отложенный запуск») и избегайте ненужных воссозданий).

Не вызывается ExecutorService.shutdown(), считающийся утечкой (я думаю, « да, это утечка », поскольку потоки имеют быть остановленным в какой-то момент)? Что бы вы предложили сделать для достижения моей цели?

Обновление. В моем конкретном случае я использую Executors.newSingleThreadExecutor(), а на Android (28) он заключен в FinalizableDelegatedExecutorService():

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

, и, как я вижу, он просто вызывает shutdown() на finalize():

    private static class FinalizableDelegatedExecutorService
            extends DelegatedExecutorService {
        FinalizableDelegatedExecutorService(ExecutorService executor) {
            super(executor);
        }
        protected void finalize() {
            super.shutdown();
        }
    }

и DelegatedExecutorService просто перенаправляют все вызовы в упакованный экземпляр (который передается в ctor).

Также ThreadPoolExecutor также вызывает shutdown() на своем finalize():

    /**
     * Invokes {@code shutdown} when this executor is no longer
     * referenced and it has no threads.
     */
    protected void finalize() {
        shutdown();
    }

Однако finalize() считается ненадежным , так как не гарантируется для вызова.

Так что безопасно не Звоните ExecutorService.shutdown() в моем Android приложении?

...