我以下列方式使用rxjava维护任务的定时器发出的结果:如何使用可观察与flatMap
在一类,我需要定期维护,我用下面的静态订阅,这导致可观测当班级被加载到内存中时,首次启动,然后按照指定的时间间隔进行。
private static Subscription subscription = Observable.timer(0, 5, TimeUnit.SECONDS)
.flatMap(new Func1<Long, Observable<String>>() {
@Override public Observable<String> call(Long aLong) {
// some code
return Observable.just(null);
}
}).subscribeOn(Schedulers.newThread()).observeOn(Schedulers.newThread())
.subscribe();
现在我有一个情况,在这里我要举报我维护用户界面的结果。
通常情况下,我会用下面的架构
Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(Subscriber<? super String> subscriber) {
// some code
subscriber.onNext(result);
subscriber.onCompleted(); }
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override public void call(String result) {
// write to the UI
}
});
但在这里,我们有刚刚执行一次可观察到的。
对于定期执行的Observable,我找不到在Subscriber中调用Action的方法,以便我可以使用subscriber.onNext()传递结果。看起来Observable没有合适的签名,它可以在timer()中占用很长的时间,同时允许使用action来订阅。但知道rxjava我相信有一个技巧;-)
我可以使用zip压缩一个Timer Observable和一次性Observable(基本上压缩两个版本在一起),但我宁愿使用第一个结构,因为它表现稍有不同。
-
我试着按以下方式两个版本合并成一个:
private static Subscription subscription = Observable.timer(0, 5, TimeUnit.SECONDS)
.flatMap(new Func1<Long, Observable<String>>() {
@Override public Observable<String> call(Long aLong) {
// some code // stays here to ensure there is no concurrency while executing
final String result = "result"; // I store the result in a final variable after some code has been finished
return Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(Subscriber<? super String> subscriber) {
subscriber.onNext(result); // then I use it in a new Observable and emit it
subscriber.onCompleted(); // not sure if this is needed here (haven't tested this yet)
}
});
}
}).subscribeOn(Schedulers.newThread()).observeOn(Schedulers.newThread())
.subscribe(new Action1<String>() {
@Override public void call(String result) {
// so I can finally consume the result on the UI thread
}
});
不是创建和发射“空”可观察的,我创建了一个,让我送导致订户。
很麻烦,但这应该工作,对吧?任何简单的解决方案?你怎么看?
为什么'Observable.timer.flatMap'不起作用? – zsxwing 2014-12-11 09:01:50
我相信这是行不通的,因为flatMap将其发射的Observable变成一个单一的Observable(我想要的),但是,我没有找到一个签名,它给了我一个与订阅者的接口[就像@Override public void call (Subscriber <?super String> subscriber)],所以我可以使用subscriber.onNext()。 – 2014-12-11 15:30:56