Когда выключение службы Exercery в приложении android

Предположим, что я планирую использовать один исполнительный сервис во всем моем приложении, к которому я отправляю новые runnable или callable's для выполнения / отправки, и я не могу завершить работу сразу после этого. Я просто хочу бросить свои «задачи» в службу исполнителей и позволить ему обрабатывать их и выполнять их, предоставляя свои ресурсы (сколько потоков у него доступно, и сколько он может создать при необходимости, а затем очереди этих задач соответственно).

Из вашего опыта использования ExecutorService в приложении для Android и с учетом изменений состояния приложения, если я не хочу постоянно отключать и повторно создавать службу-исполнители, делая это:

executor = Executors.newCachedThreadPool(); executor.submit(some Runnable); executor.shutdown(); 

, В какое время и где бы вы посоветовали отключить сервис, а затем восстановить его, чтобы я мог предотвратить некоторые утечки или некоторые непредвиденные последствия?

Я в основном повторяю:

1) Закрытие приложения по кнопке «Назад» в последнем действии в backstack (приложение использует много действий). 2) Приложение, выполняющееся в фоновом режиме (по любому из этих действий). 3) Приложение, возвращающееся на передний план (по любому из этих видов деятельности)

Вы можете сделать одну работу. Создайте исполнителя как демона. Затем он будет автоматически завершен, когда ваше приложение выйдет. Вам не нужно явно вызывать завершение shutdown .

  ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setDaemon(true); return t; } }); 

У меня есть экземпляр Singleton из ExecutorService, который привязан к экземпляру приложения Android через графический объект Dagger. Таким образом, экземпляр живет до тех пор, пока сам объект приложения. Поскольку класс приложения Android не имеет функции обратного вызова onDestroy (), никогда не известно, когда shutdown () следует вызывать в ExecutorService.

Когда я боялся утечек памяти, я также изучал ThreadPoolExecutor и играл с ним, чтобы узнать. Вот что я нашел: Executors.newCachedThreadPool () создает ThreadPoolExecutor со следующими параметрами:

 ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()) 

Это corePoolSize 0, что означает, что минимальное число рабочих потоков остается в живых, поэтому нет. Когда TPE (aka ExecutorService) выполняет задачу, она создает рабочий поток и добавляет его в пул. Теперь, когда в течение 60 секунд не возникает новая задача, рабочий поток (все еще поддерживаемый) прекращается и удаляется из пула (кеш).

Для меня это означает, что утечки памяти не будет, даже когда shutdown () никогда не будет вызываться в ExecutorService, поскольку все рабочие потоки, которые когда-либо существовали, тайм-аут и будут удалены из пула, когда новая задача не появится во время Период ожидания. Я предполагаю, что в этом случае не будет ссылок на рабочие потоки, оставшиеся в пуле, и поэтому GC может очистить экземпляр TPE.

Не стесняйтесь исправить меня, если я ошибаюсь.