首页 > 解决方案 > 如何在 RxJava 中正确使用 observable 和 observer?

问题描述

首先,感谢大家花时间帮助我。我不确定我写的波纹管代码是否正确。因此,如果您确实看到任何问题,请告诉我,并可能提出一些解决方法。

所以我想在我的 2 个类中应用 rxjava 来呈现观察者和可观察者。这样,每当通过单击 JavaFX 中的按钮,可观察到的 currentPage 发生变化时,观察者都会得到通知和更新。尽管代码运行良好,但我不确定每次创建一个可观察变量是否正确?而且 onComplete 是否会取消订阅或进行一些清理(我怀疑我的代码可能有一些泄漏内存)。由于我找不到任何对此有明确总结/解释的在线资源,我真的需要你们的帮助。谢谢!

P/s:我是 RxJava 新手,所以请不要对我苛刻。谢谢!

所以 PrimaryInfoModel 是观察者:

public class PrimaryInfoModel {
    private int currentPage;
    private int currentCategory;

    public static Observer<Integer> getPageObserver() {
        return new Observer<>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                System.out.println(integer); currentPage = integer;
            }

            @Override
            public void onError(@NonNull Throwable e) {
                System.out.println(e.getMessage());
            }

            @Override
            public void onComplete() {
                System.out.println("Complete");
            }
        };
    }
}

NavigationController 是可观察的:

public class NavigationController implements Initializable {

    private int currentPage;
    private Observable<Integer> observable;

    public NavigationController() {
    }

    @FXML
    private Button page1, page2, page3, page4, page5, prevPage, nextPage;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        setCurrentButton();
    }

    @FXML
    private void setCurrentButton(MouseEvent event) {
        int oldPage = currentPage;
        cleanEffect();
        Object source = event.getSource();
        if (source == page1) {
            currentPage = 0;
        }
        if (source == page2) {
            currentPage = 1;
        }
        if (source == page3) {
            currentPage = 2;
        }
        if (source == page4) {
            currentPage = 3;
        }
        if (source == page5) {
            currentPage = 4;
        }
        if (oldPage != currentPage) {
            observable = getObservable();
            observable.observeOn(Schedulers.io()).subscribeOn(Schedulers.io()).subscribe(PrimaryInfoModel.getPageObserver());
        }
    }

    private Observable<Integer> getObservable() {
        return Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                emitter.onNext(currentPage);
                emitter.onComplete();
            }
        });
    }
}

标签: javajavafxrx-java

解决方案


推荐阅读