새 스레드에서 하나씩 처리해야하는 작업 목록이 있으며 결과가 일부 주 스레드에 의해 메서드에 표시되어야합니다. 그러나 이것이 작동하지 않는 것처럼 보일 경우 flatMap
메서드가 주 스레드에서 호출됩니다.RxJava 비동기 구독
subscribeOn
메서드가이 경우 "스레드 전환"을 처리하지 않는 이유는 무엇입니까?
다른 스레드에서 일부 작업을 수행하는 데 더 좋은 패턴은 무엇입니까?
List<Task> tasks = ...;
Observable.from(tasks)
.flatMap(task -> {
// should be handled in a new thread
try {
return Observable.just(task.call());
} catch (Exception e) {
log.error("Error", e);
}
return Observable.empty();
})
.subscribeOn(Schedulers.newThread())
.observeOn(MySchedulers.main())
.subscribe(this::show); // subscribe called from main thread
'Task'는 lukstei가 만든 커스텀 클래스입니다. 우리는 .NET 비동기 태스크와 같은 이름과 목적을 가진'Task' 클래스를 가지고 있지 않습니다. 그러나,'subscribeOn'을 움직이는 것이 옳습니다! –
@AdamS 네, 맞습니다. 'Task'는 오류 처리와 관련하여 대답을 위해 Runnable 또는 Callable – lukstei
@ james-world에 감사드립니다. 하나의 작업 만 실패 할 수 있습니다. 조용히 무시해야하지만, 내 솔루션과는 달리 onError + onErrorResumeNext를 사용하는 이점은 없습니다. – lukstei