Как я могу создать эмиссию асинхронно? - PullRequest
0 голосов
/ 01 мая 2020

Я пишу приложение, используя 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;
    }
}
...