如何订阅在代码的其他部分发出的Observable?

时间:2019-05-27 20:57:04

标签: android observable rx-java

我有点像RxJava的初学者。我有以下问题。 我有一个Presenter和一个Fragment。我正在片段的onCreate中创建演示者。 我想订阅Presenter的构造函数中的Observable。并且,当片段的onViewCreated触发时(会在Presenter中调用某些方法-即onViewReady),此Observable应该发出。 我遇到的问题是,当我创建Observable(在Presenter的构造函数中)时,我还必须传递发射器。我该如何在构造函数中订阅可观察对象并稍后在onViewReady内部发出?

我尝试搜索StackOverflow和Medium链接。所有这些似乎都在可观察的创建过程中始终通过发射器。

片段

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    // create presenter
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    // call presenter.onViewReady
}

演示者

Presenter() {
    // create and subscribe to observable
}

public void onViewReady() {
    // emit observable
}

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用主题?

片段代码:

public Subject<Integer> subject = PublishSubject.create()

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    presenter = new Presenter(subject);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    subject.onNext(1);
}

演示者代码:

Presenter(Subject<Integer> subject) {
    subject.doOnNext(i -> onViewReay()).subscribe();
}

public void onViewReady() {
    // code here...
}

我希望语法是好的,因为我在没有android studio的情况下做到了这一点。也。我建议您使用一次性工具,以确保您将订阅处置在碎片破坏上。

,我只在RxJava2中尝试过。因此,如果您使用的是RxJava1,则可能需要进行一些其他调整。

答案 1 :(得分:0)

以下是如何实现此目标的示例:

private final Observable<MyClass> myObservable;

Presenter() {
    // create observable
    myObservable = Observable.create(new Action1<Emitter<MyClass>>() {
        @Override
        public void call(Emitter<MyClass> emitter) {
            // Emit here
            emitter.onNext(...);
            emitter.onNext(...);

            emitter.onCompleted();
        }
    });
}

public void onViewReady() {
    // subscribe to the observable
    myObservable.subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers::mainThread)
                .subscribe(
                        new Action1<MyClass>() {
                            @Override
                            public void call(MyClass mc) {
                                // TODO implement
                            }
                        },
                        new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                                // TODO implement
                            }
                        }
                );
}