Проблемы с Android AsyncTask - JavaMail - PullRequest
0 голосов
/ 25 мая 2020

Как сказано в заголовке, у меня возникают проблемы с многопоточностью.

Я использую JavaMail для создания приложения электронной почты с полностью поддерживаемой отправкой / получением электронной почты.

У меня есть метод получения электронной почты с сервера, который запускается со службой каждые x секунд. Проблема в том, что когда я впервые вхожу в систему с учетной записью и начинаю получать электронные письма с сервера, я не могу отправлять сообщения, пока все электронные письма не будут получены и поток не будет закрыт.

Я плохо знаком с AsyncTasks, но оба класса (fetch и sendmail) объявлены отдельно, поэтому я не уверен, почему они мешают друг другу.

1 Ответ

0 голосов
/ 25 мая 2020

По умолчанию AsyncTask s запускаются в одном фоновом потоке. (!!) Таким образом, ваша задача отправки, вероятно, будет поставлена ​​в очередь для запуска после того, как будут выполнены все выборки.

Вы можете выбрать запуск AsyncTasks в пуле потоков, используя AsyncTask.executeOnExecutor, передавая THREAD_POOL_EXECUTOR в качестве аргумента. Итак, теперь ваша задача отправки будет поставлена ​​в очередь после завершения всех отправок в N доступных потоках в пуле потоков.

При этом длительные операции ввода-вывода, вероятно, следует запускать на выделенных пулах потоков, а не на THREAD_POOL_EXECUTOR, поскольку пулы потоков по умолчанию предназначены для использования краткосрочными задачами. Если вы этого не сделаете, вы в конечном итоге лишитесь использования стандартных пулов потоков, связанных с пользовательским интерфейсом. Вам действительно нужен выделенный пул из двух, трех или четырех потоков для приема и, возможно, отдельный один, два или три потока для отправки.

Как бы то ни было, AsyncTask датируется темными веками Android, неоднократно подвергался злоупотреблениям со стороны команды разработчиков Android, и теперь официально объявлен устаревшим. (Ура!) Аргументы шаблона и синтаксис исполнителя AsyncTask с самого начала - просто плохая идея; и при его использовании слишком легко ошибиться. Теперь Google рекомендует использовать вместо него java.util.concurrent.

ps. Честно говоря, AsyncTask был разработан в эпоху, когда мобильные телефоны были патетическими c вещами с дисплеями 320x200, одним процессором, где наличие двух целых потоков было большим делом. java.util.concurrent намного лучше.

...