Как уведомить mainthread при завершении WorkEvent с исключением?
Я работаю с IBM WorkManager (v8.0.0), чтобы выполнить некоторую работу асинхронно с основным потоком.
Для этого я использую следующий код:
// wm = via resource injected WorkManager
WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener() {
@Override
public void workStarted(WorkEvent arg0) {
}
@Override
public void workRejected(WorkEvent arg0) {
}
@Override
public void workCompleted(WorkEvent arg0) {
WorkException exception = arg0.getException();
if (null != exception) {
throw new RuntimeException("WorkCompleted with Exception");
}
}
@Override
public void workAccepted(WorkEvent arg0) {
}
});
Это работает довольно хорошо, пока WorkEvent
был завершен без исключения. Но когда оно было завершено с исключением, я хочу уведомить mainthread, чтобы он не отправлял больше WorkItems в WorkManager
,
Я думал, что могу поднять RunetimeException
чтобы уведомить mainthread, но, проанализировав журналы, я обнаружил, что исключение выдается в тот момент, когда mainthread завершил отправку всех WorkItems
к WorkManager
и зовет join
метод WorkManager
- что слишком поздно (в большинстве случаев 50000 пунктов должны быть сделаны WorkManager
).
Итак, как я могу прервать мою основную тему, чтобы она не отправляла больше WorkManager
в этот момент, когда исключение признается в workCompleted
?
1 ответ
Вам нужен "более прямой" интерфейс.
Имея в виду; вы показываете код, который вызывает:
WorkItem item = wm.startWork(work, WorkManager.INDEFINITE, new WorkListener()
Класс, который содержит эти инструкции, нуждается в некотором "входном" канале; например, в этом классе может быть "простое" поле List<Exception>
что ваши рабочие элементы добавляют свои исключения.
И ваш "основной" класс, который создает эти рабочие элементы, должен регулярно проверять этот список; и просто прекратите добавлять новые рабочие элементы при обнаружении исключения.
Конечно, вы должны сделать этот поток безопасным и обеспечить разумную архитектуру.