gpt4 book ai didi

android - RxJava - 订阅者只运行一次吗

转载 作者:行者123 更新时间:2023-11-29 20:54:53 25 4
gpt4 key购买 nike

我对订阅者以及他们何时对观察者使用react有些困惑。假设我有以下简单的观察者和一个执行操作的订阅者:

Observable.just(preferences.getBoolean(C"vibrate", false))
.subscribeOn(Schedulers.io())//observe on new thread
.observeOn(AndroidSchedulers.mainThread()) //subscribe(listen) on main thread
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean shouldVibrate) {
if (shouldVibrate)
Toast.makeText(context,"i should vibrate now",Toast.SHORT).show();
}
});

我意识到当第一次看到这段代码时,观察者会立即被调用。但是,如果之后再次更改共享首选项怎么办,此代码会自动再次运行还是仅在我每次调用 subscribe 时运行?如果我希望它在每次更改共享首选项时运行(有点像观察者)怎么办?

最佳答案

这真的取决于可观察的。我建议阅读 "Hot" and "Cold" Observables在响应式 Observable 文档上。

在您的例子中,这是一个 Cold 可观察对象。每次订阅它都会重新订阅。但是,您只能订阅一次。您的代码 fragment 实际上会阻止偏好获取(可能不是一个大问题),但它只会发出一个偏好。

我建议使用 ContentObservable RxJava 的 RxAndroid 扩展库中的类,您已经在使用它(因为 AndroidSchedulers)。

它看起来像这样(这是餐巾纸背面的代码,我没有编译或运行它):

// Defer the observable so it gets a fresh preference value. Also, we'll
// be using it a few times.
final Observable<Boolean> vibratePreference = Observable.defer(
new Func0<Observable<Boolean>>() {

@Override
public Observable<Boolean> call() {
return Observable.just(preferences.getBoolean("vibrate", false));
}

});

vibratePreference
.concatWith(ContentObservable.fromSharedPreferencesChanges(preferences)
// Only consider changes to the vibrate preference.
.filter(new Func1<String, Boolean>() {

@Override
public Boolean call(final String key) {
return "vibrate".equals(key);
}

})
// Each time the preference changes, get the latest value.
.flatMap(new Func1<String, Observable<Boolean>>() {

@Override
public Observable<Boolean>(final String unusedKey) {
return vibratePreference;
}

}))
.scheduleOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( /* ...and so on. */ );

此外,如果您在 Activity 或 fragment 上执行此操作,我强烈建议您查看 AppObservable 中的 bindActivitybindFragment RxAndroid 以确保您将此可观察对象绑定(bind)到生命周期。您可能还想存储一个 CompositeSubscription,您可以在 onPause 中将其清空并在 onResume 中恢复订阅。这些内容略有偏离主题,但很可能很快就会有用。

关于android - RxJava - 订阅者只运行一次吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28036398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com