Возвращаемые значения AsyncTask.THREAD_POOL_EXECUTOR

Как мне вернуть значения нескольких AsyncTask в список без использования get()?

Я сейчас этим занимаюсь, но знаю, что это неправильно.

for (int i=0; i != mediaList.size(); i++){
    UploadImage uploadImage = new UploadImage(this,
        new File(FileChooser.getPath(this, mediaList.get(i).uri)));
    String x = uploadImage.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).get();
    mediaResult.add(x);
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
29
2

Ответы 2

How do I return the values of multiple AsyncTask into a list without using get()?

Вы этого не сделаете. AsyncTask является асинхронным и выполняет свою работу в фоновом потоке.

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

Вы можете создать защелку обратного отсчета со счетчиком количества асинхронных операций. Затем подождите, пока он достигнет 0

CountDownLatch cdl = new CountDownLatch(3);
Async1.oncomplete - > cdl.countDown();
Async2.oncomplete - > cdl.countDown();
Async3.oncomplete - > cdl.countDown();
cdl.await

Это не возвращает значения каждого асинхронного цикла, а просто ждет, пока все будет завершено. Удаление get() из моего кода и добавление CountDownLatch - вот и все, что нужно сделать.

Adegoke A 07.06.2018 00:50

Вы сможете вернуться после ожидания.

TomH 07.06.2018 05:14

Другие вопросы по теме