Я пишу приложение, используя MVC архитектуру. Мне нужно создать несколько представлений, чтобы представить одно свойство модели. Я хочу запускать операции создания представления асинхронно. Я использовал Observable.defer(() -> Observable.just(new View())).subscribeOn(Schedulers.computation())
, но мне кажется, что я неправильно использую фабрику. Есть ли лучший (более чистый) способ создания представления создания для конкретного планировщика? DemoApp показывает проблему в деталях.
import java.util.Random;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
public class DemoApp {
public static void main(String[] args) {
ObjectProperty<Employee> employeeProperty = new SimpleObjectProperty<>();
employeeProperty.addListener((ChangeListener<Employee>) (observable, oldEmployee, employee) -> {
Observable.defer(() -> Observable.just(new EmployeeView()))
.subscribeOn(Schedulers.computation())
.subscribe(employeeView -> {
new EmployeeController(employeeView, employee);
});
});
employeeProperty.addListener((ChangeListener<Employee>) (observable, oldEmployee, employee) -> {
Observable.defer(() -> Observable.just(new EmployeeView()))
.subscribeOn(Schedulers.computation())
.subscribe(employeeView -> {
new EmployeeController(employeeView, employee);
});
});
employeeProperty.set(new Employee("Kowalsky"));
try {
TimeUnit.SECONDS.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class EmployeeController {
public EmployeeController(EmployeeView employeeView, Employee employee) {
}
}
class EmployeeView {
private static int idGenerator = 0;
private final int id = ++idGenerator;
//time consuming view creation
public EmployeeView() {
System.out.println("EmployeeView[id=" + id + "] creation started" + Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(4));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("EmployeeView[id=" + id + "] creation finished");
}
}
class Employee {
private final String name;
public Employee(String name) {
this.name = name;
}
public String getName() {
return name;
}
}