2016-12-31 4 views
-1

То, что я хочу сделать, довольно просто в теории - мне нужно сканировать все файлы MP3, присутствующие на устройстве, и выполнять некоторые обновления метаданных, запрашивая что-то вроде AcoustId или GraceNote.Запуск mutliple threads внутри IntentService

Я планирую использовать класс, расширив IntentService, а в onHandleIntent() планирую создавать потоки N, каждый поток обновляет метаданные одного файла. Основная причина, по которой я использую IntentService, - это то, что мне не нужно общаться с потоком пользовательского интерфейса, и что задача под рукой занимает относительно много времени.

Мой главный вопрос: поддерживает ли IntentService пользовательские потоки? Если нет, то какая у меня лучшая альтернатива? Я знаю, что я не должен использовать AsyncTask, так как они используются только для относительно небольших вычислений.

Заранее благодарен!

ответ

2

Нет, IntentService имеет только одну рабочую нить, обрабатывая входящие Intents последовательно. Вы должны просто расширить Service, если хотите сделать что-то более сложное.

+0

ничто не мешает автору от порождая собственную нить хотя –

+1

@OlegBogdanov - за исключением, если вы расширяете 'IntentService', в сервис останавливается сразу после окончания 'onHandleIntent', что делает его ужасным выбором для нереста ваших собственных потоков. – ianhanniballake

1

Нерест N потоки никогда не звучит как отличная идея, особенно если список ваших задач несвязанный (кто знает, сколько mp3 треки вы получили)

Одним из удобств, которые можно использовать в андроида threadpool, что даст вы уровень параллелизма, но и некоторые здравомыслящие границы

Обратите внимание, что AsyncTask не предназначена для чего-л, которые должны работать в течение нескольких минут или часов, но один или два запроса HTTP может полностью сделать это в сроках, рекомендованные «несколько секунд»

Самое главное, что все операции, о которых вы описали, являются вводом-выводом и вообще не нужны дополнительные потоки, если у вас есть доступ к асинхронному вводу-выводу api, все ваши потоки будут просто ждать доступа к сети или файловой системе, поэтому это расточительно. Если вы можете себе позволить, используя (и обучения) AsynchronousFileChannel и AsyncHttpClient это может сделать большую разницу в плане качества и масштабируемости для вашего приложения

+1

Спасибо, Олег, я обязательно прочитаю вышеупомянутый материал. –

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