Как установить исключение ExecutionException, генерируемое методом get AsyncTask?

Согласно официальной документации, AsyncTask # get () генерирует исключение ExecutionException при возникновении исключения в многопоточном задании. Как я могу уведомить текущий AsyncTask о том, что в методе AsyncTask#doInBackground(Params...) возникло исключение?

2 ответа

Лучше всего не использовать AsyncTask.get() вообще потому что get() синхронно, так что вы ничего не получите

Ты не можешь

Исключение ExecutionException Future#get() метод, который внутренне вызывается AsyncTask#get(),

Фьючерсы позволяют генерировать исключения в пределах их исполняемого асинхронного блока. Вызов Future#get() выдаст такое исключение, инкапсулированное в ExecutionException.

AsyncTasks, однако, не позволяют генерировать исключения в пределах AsyncTask#doInBackground() метод. Следовательно, вы не можете использовать этот механизм для обработки исключений. Это, кажется, решение архитектурного дизайна.

Отказ от ответственности:

Вы, вероятно, все еще можете бросить RuntimeExceptions в вашем AsyncTask#doInBackground(), что приводит к ExecutionException на AsyncTask#get()... но вы не должны;)

Замечания:

Вы уверены, что хотите позвонить AsyncTask#get() и заблокировать ваш вызывающий поток? Вызов его из потока main/ui приведет к тому, что ваш пользовательский интерфейс перестанет обновляться, пока ваша задача не будет завершена.

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