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

И ваш "основной" класс, который создает эти рабочие элементы, должен регулярно проверять этот список; и просто прекратите добавлять новые рабочие элементы при обнаружении исключения.

Конечно, вы должны сделать этот поток безопасным и обеспечить разумную архитектуру.

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