如何订阅在代码的其他部分发出的 Observable?
How to subscribe to an Observable that emits in some other part of the code?
我是 RxJava 的初学者。我有以下问题。
我有一个 Presenter
和一个 Fragment
。我正在 Fragment 的 onCreate
内创建 Presenter。
我想在 Presenter 的构造函数中订阅 Observable
。这个 Observable 应该在 Fragment 的 onViewCreated
触发时发出(它调用 Presenter 中的一些方法——即 onViewReady
)。
我 运行 遇到的问题是,当我创建 Observable(在 Presenter 的构造函数中)时,我还必须传递发射器。我如何在构造函数中订阅可观察对象并稍后在 onViewReady
?
中发出
我尝试搜索一堆 Whosebug 和 Medium 链接。在 Observable 创建期间,它们似乎总是通过发射器。
片段
@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
}
您考虑过使用主题吗?
片段代码:
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,则可能需要进行一些额外的调整。
以下是您如何实现该目标的示例:
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
}
}
);
}
我是 RxJava 的初学者。我有以下问题。
我有一个 Presenter
和一个 Fragment
。我正在 Fragment 的 onCreate
内创建 Presenter。
我想在 Presenter 的构造函数中订阅 Observable
。这个 Observable 应该在 Fragment 的 onViewCreated
触发时发出(它调用 Presenter 中的一些方法——即 onViewReady
)。
我 运行 遇到的问题是,当我创建 Observable(在 Presenter 的构造函数中)时,我还必须传递发射器。我如何在构造函数中订阅可观察对象并稍后在 onViewReady
?
我尝试搜索一堆 Whosebug 和 Medium 链接。在 Observable 创建期间,它们似乎总是通过发射器。
片段
@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
}
您考虑过使用主题吗?
片段代码:
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,则可能需要进行一些额外的调整。
以下是您如何实现该目标的示例:
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
}
}
);
}