Как установить исключение 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 приведет к тому, что ваш пользовательский интерфейс перестанет обновляться, пока ваша задача не будет завершена.