我以下列方式使用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