2015-01-03 3 views
1

Я написал IntentService, который я собираюсь использовать для загрузки некоторых тяжелых данных из Интернета (большие изображения в основном).ExecutorService внутри IntentService. Будет ли он убит Android?

Класс выглядит следующим образом:

public class UpdateService extends IntentService { 

    public UpdateService() { 
     super(UpdateService.class.getCanonicalName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     final ExecutorService executorService = Executors.newFixedThreadPool(3); 
     List<ListenableFuture> futures = new ArrayList<>(); 

     for(Runnable r : getRunnables()){ 
      executorService.execute(r); 
      futures.add(r.getFuture()); 
     } 

     Futures.addCallback(

       Futures.allAsList(futures), 

       new FutureCallback<List<Boolean>>() { 
        @Override 
        public void onSuccess(List<Boolean> result) { 
         // do some logic here 
         executorService.shutdown(); 
        } 

        @Override 
        public void onFailure(Throwable t) { 
         // do some error handling here 
         executorService.shutdown(); 
        } 
       } 
     );  

    } 
} 

Как вы можете видеть, что метод onHandleIntent() возвращается довольно быстро, так как большая часть деятельности осуществляется в рамках Runnables исполняемых ExecutorService.

Будет ли андроид убить IntentService и, следовательно, убить потоки, начатые ExecutorService, через некоторое время, когда возвращается метод onHandleIntent()?

Или это как-то обнаруживает, что потоки все еще существуют, а служба намерений все еще жива?

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

ответ

4

Будет ли андроид убить IntentService

IntentService уничтожит себя, через stopSelf().

и, следовательно, убить темы от ExecutorService через некоторое время

Нити просочилась, но они будут работать, пока процесс не будет завершен. Поскольку у вас больше нет Service, говорящего Android, что ваш процесс выполняет работу, ваш процесс может быть прекращен довольно быстро.

Как изменить код, чтобы запретить Android убивать службу?

Не использовать IntentService. Используйте Service и позвоните stopSelf() самостоятельно, как только все ваши темы будут выполнены с их работой.

+0

Спасибо, отлично объяснено – Giordano

Смежные вопросы