Ответ 1
onError будет вызываться, если при выполнении асинхронной операции возникло исключение.
Обычно они являются Throwables, которые расширяют java.io.IOException, вызванные сбоями ввода-вывода из-за ненадежных исключений соединения или протокола, из-за логической ошибки из-за несоответствия между клиентом и сервером.
Вы можете получить Throwable, когда onError вызывается, вызывая:
event.getThrowable();
РЕДАКТИРОВАТЬ для решения следующих вопросов
Забыв о AsyncContext за секунду, рассмотрим следующий класс:
public class MyRunnableClass implements Runnable {
private Listener mListener;
interface Listener {
void onError(Throwable error);
}
public void setListener(Listener listener) {
mListener = listener;
}
@Override
public void run() {
// Some important code to be executed goes here
// Pretend an exception was caught in a try/catch/finally
// block that was doing an I/O operation
Throwable someError = new IOException();
if (mListener != null) {
mListener.onError(someError);
}
}
}
Является ли теперь более понятным, как будет вызываться метод lister onError, поскольку возникло исключение при вызове метода запуска MyRunnableClass?
MyRunnableClass mrc = new MyRunnableClass();
mrc.setListener(new Listener() {
@Override
public void onError(Throwable error) {
}
});
Executors.newSingleThreadScheduledExecutor().schedule(mrc, 1000L, TimeUnit.MILLISECONDS);
Это не отличается от того, как AsyncContext держится на слушателе и уведомляет об этом, если он встречает исключение, которое он хочет сообщить слушателю. Как запускается метод запуска, действительно является второстепенным по отношению к тому, что владелец исполняемого кода также является тем, который содержит ссылку на слушателя.