Является ли библиотека Java.util.concurrent лучше при выполнении каких-либо задач над стандартным Android AsyncTask

Я понимаю, что вы получаете больше настроек, но есть ли преимущества производительности (mem / speed) для использования параллельных классов библиотеки, просто используя запас AsyncTask или просто создавая потоки и вызывая запуск?

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

    Теперь есть некоторые задачи, для которых AsyncTask не подходит. Например, если вы хотите загрузить сразу несколько изображений с сервера. AsyncTask может быть не лучшим вариантом. Для одного AsyncTasks можно запускать только один раз и его нельзя перезапустить. AsyncTasks принадлежит потоку, на котором выполняется фоновый метод, и этот поток нельзя использовать повторно или совместно использовать. Поэтому, если у вас было 10 или 20 изображений, что означает 10 или 20 потоков для создания и выключения, если вы использовали AsyncTasks. Или загрузите сразу все изображения, что означает, что ваш пользовательский интерфейс не будет обновляться до тех пор, пока все изображения не будут полностью загружены с сервера через 20 отдельных вызовов. Либо вы платите за больше памяти, ресурсов и т. Д. За хороший ответ на интерфейс, или ваш пользовательский интерфейс оплачивает цену за более низкие накладные расходы. Ничто не здорово.

    Лучший вариант – загрузить поток один раз, отправить несколько заданий легкого веса для запуска и отправить их обратно в поток пользовательского интерфейса. Я создал свою собственную версию чего-то вроде AsyncTask, которую я называю PipelineHandler, который создает один поток, и запускает заданные ему задания. Эти задания похожи на AsyncTask на то, что у них есть метод, который вызывается из потока пользовательского интерфейса, а другой метод, который вызывается в потоке пользовательского интерфейса для выполнения обновлений. Преимущество здесь в том, что я могу использовать один поток для запуска как можно большего количества заданий. И я могу легко масштабировать потоки, обслуживающие очередь, при необходимости, без необходимости менять что-либо, кроме опции конфигурации. Под обложками он использует параллельные классы Java ExecutorService, но также использует Handler для обеспечения возможности запуска чего-то обратно в потоке пользовательского интерфейса. Таким образом, он объединяет Java Concurrent lib и Android lib для создания этого.

    Поэтому, чтобы ответить на ваш вопрос, я думаю, что AsyncTask отлично подходит для одноразовых заданий, таких как вызовы типа запроса на запрос обслуживания, но не для пакетной обработки, таких как загрузка изображений или загрузка файлов, особенно если вам нужно сделать много звонков одновременно. Сопутствующие библиотеки Java могут сыграть определенную роль в том, чтобы помочь вам выполнять эти типы задач, но ограничены, потому что они решают половину проблемы, а именно, запускают потоки в потоках. Совместные библиотеки Java. Хорошие результаты для пакетной работы, но они не очень хороши при взаимодействии с потоком пользовательского интерфейса. Поэтому вам придется объединить их вместе, чаще всего, чтобы получить решение.

    Если вы посмотрите на исходный код AsyncTask вы увидите, что все это построено на FutureTask и других классах из java.util.concurrent.* .

    Я полагаю, что использование AsyncTask более удобно, и чистый FutureTask даст лишь небольшую выгоду, если таковая имеется. Хотя вы можете использовать другие API-интерфейсы из java.util.concurrent.* Для выполнения более сложных задач.

    AsyncTask в основном сопоставляется с SwingWorker на рабочем столе, а не с API параллелизма. Он использует потоки за кулисами, но предоставляет методы, которые помогут вам взаимодействовать с компонентами пользовательского интерфейса в потоке пользовательского интерфейса.