2015-12-10 1 views
1

Im пишет SDK, который имеет одноэлементный класс с ExecutorService. Это выглядит примерно так:Как отключить ExecutorService в приложении для Android

public class MySingleton { 
    private static MySingleton mInstance; 
    private ExecutorService mExecutorService; 

    private MySingleton() { 
     mExecutorService = Executors.newSingleThreadExecutor(); 
    } 

    // ... 

    public void doSomething(Runnable runnable) { 
     mExecutorService.execute(runnable); 
    } 
} 

Этот класс SDK предназначен для использования в течение всего приложения для выполнения задач/Runnables и функция йоЗотеЬЫпда() состоит в очереди и запускать все Runnables в одном потоке.

Но одна вещь, которую я не мог понять, - это позвонить в Исполнительный центр. shutdown() способ. Если я называю это так:

public void doSomething(Runnable runnable) { 
    if (mExecutorService.isTerminated()) { 
     mExecutorService = Executors.newSingleThreadExecutor(); 
    } 
    mExecutorService.execute(runnable); 
    mExecutorService.shutdown(); 
} 

Было бы поражение цели использования одного тему, потому что, если старая Runnable все еще работает, когда йоЗотеЬЫпд() называется 2-й раз, может быть две разные темы, работающих одновременно. Конечно, у меня может быть функция, которая вручную отключает ExecutorService, но требование, чтобы пользователь SDK явно вызывал функцию выключения, не казался подходящим.

Может ли кто-нибудь показать мне несколько советов о том, когда/как вызвать ExecutorService.shutdown() в приложении для Android? Спасибо

+0

Вы должны завершить работу, когда закончите пользоваться сервисом. Предположительно, это когда ваше приложение выходит. – shmosel

+0

@shmosel Спасибо за ответ. Я понимаю, что Im должен был остановиться, когда я закончил службу. Но мой вопрос был скорее о том, как это будет выглядеть в платформе Android? Есть ли слушатель для прослушивания, когда приложение закрывается? (есть onStop() и onDestroy(), но они предназначены для Деяний). – baekacaek

ответ

0

Нет никакой веской причины вызывать выключение при каждом выполнении какой-либо задачи. Возможно, вы захотите вызвать shutdown, когда какая-то часть вашего приложения будет закрыта/закончена. То есть. когда Служба останавливается, - тогда, если она использовала исполнителей, то я предполагаю, что вы должны закрыть их, но на самом деле дело в том, чтобы разрешить выполнение всех задач до того, как логика завершения работы выполнит какой-то код завершения. то есть. используя:

executors.shutdown(); 
    if (!executors.awaitTermination(5, TimeUnit.SECONDS)) { 
    executors.shutdownNow(); 
    } 

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