События Threading с использованием GreenRobot EventBus

Я только начал смотреть на GreenRobot EventBus для Android и вопрос о потоковом использовании.

У меня есть длительный процесс, который я бы хотел запустить в фоновом потоке, который при завершении обновляет пользовательский интерфейс.

Так что-то вроде:

public void onEventBackgroundThread(MyEvent event) {
        doSomeLongRunningProcess();
        updateUI();
    }

Очевидно, что updateUI() нельзя вызвать здесь, потому что он также будет работать в фоновом режиме.

Итак, каков был бы рекомендуемый способ справиться с этим? Огоньте другое событие из моего onEventBackgroundThread(), которое будет работать в потоке пользовательского интерфейса? Или уволить его из самого длительного процесса? Или есть лучший образец?

Ответ 1

Я бы, вероятно, запустил другое событие, когда вы получите результат.

public void onEventBackgroundThread(MyEvent event) {
    doSomeLongRunningProcess();
    EventBus.getDefault().post(new MyEventResult());
}

Помните, что: чтение документов, вы найдете это:

BackgroundThread. Абонент будет вызываться в фоновом потоке. Если проводка потока не является основным потоком, методы обработчика событий будут вызываемый непосредственно в потоке проводки. Если поток проводки является main thread, EventBus использует один фоновый поток, который будет доставлять все его события последовательно. Обработчики событий, использующие этот режим следует попытаться быстро вернуться, чтобы избежать блокировки фонового потока.

Если вы займете много времени в этом методе, другие обратные вызовы EventBus будут задерживаться, что, вероятно, переведёт в невосприимчивое приложение.

Вероятно, вы хотите использовать onEventAsync:

Async: методы обработчика событий вызывают в отдельном потоке. Это всегда независимо от проводки и основного потока. События в проводке никогда не ждут методов обработчика событий, используя этот режим. Методы обработчика событий должны использовать этот режим, если их выполнение может потребуется некоторое время, например. для доступа к сети. Избегайте запуска большого количество длинных асинхронных методов обработчика одновременно для ограничения количества одновременных потоков. EventBus использует пул потоков для эффективного повторного использования потоков из завершенного обработчика асинхронных событий уведомления.

Ответ 2

Я предлагаю запустить другое событие, которое будет обрабатываться с помощью метода onEventMainThread.

Это положительно влияет на updateUI вообще не называться, если приемник уже незарегистрирован (например, активность незарегистрирована, потому что она была уничтожена).