[英]How to accumulate multiple observables and emit latest after some time (debounce)
我正在嘗試實現以下想法
我有一些定期發出事件的對象,但是我只對最近的對象感興趣。 這是代碼中的樣子
private void someEvent() {
List<Object> data = new ArrayList<>();
// do something
addEventObservable(generateEventObservable(companyIds));
}
private Observable<SomeValue> generateEventObservable(List<Object> object) {
// generate observable in this case fetch some data from network
}
private void addEventObservable(Observable<SomeValue> observ) {
// Accumulate all incoming observables, but emit the most recent one
// Get result ad invoke callback
}
考慮到someEvent
是鍵入文本的事件,並且在每個鍵入的字符上我都會生成一個observable並將其傳遞給addEventObservable
。 在這種方法中,我需要以某種方式累積所有接收到的可觀測值,並且僅在一段時間后運行最新的可觀測值。
我可以使用計時器來實現,也可以通過添加到某些Queue對象中來延遲發布。 但是,也許有什么方法可以優雅地使用RxJAva來實現呢?
您可以使用RxBinding庫('com.jakewharton.rxbinding:rxbinding:1.0.1')將視圖轉換為流。
首先,將EditText
轉換為Observable
流。 這將為文本更改發出一個事件,就像TextWatcher
:
RxTextView.textChanges(companyIdsEditText)
然后,如標題所示,您可以使用debounce
操作符來等待用戶輸入中的暫停。 在這里,我將其應用以等待用戶輸入中的500ms暫停:
RxTextView.textChanges(companyIdsEditText)
.debounce(500, TimeUnit.MILLISECONDS)
您可以進一步應用一些可選過濾,例如,公司ID的最小長度為五個字符:
RxTextView.textChanges(companyIdsEditText)
.debounce(500, TimeUnit.MILLISECONDS)
.filter(new Func1<CharSequence,Boolean>() {
@Override
public Boolean call(CharSequence charSequence) {
return charSequence != null && charSequence.toString().length() >= 5;
}
})
現在您就可以根據用戶輸入進行網絡通話了。 為此,我們將flatMap()
用戶輸入,以便為結果類型創建另一個Observable
:
RxTextView.textChanges(companyIdsEditText)
.debounce(500, TimeUnit.MILLISECONDS)
.filter(new Func1<CharSequence,Boolean>() {
@Override
public Boolean call(CharSequence charSequence) {
return charSequence != null && charSequence.toString().length() >= 5;
}
})
.flatMap(new Func1<CharSequence,Observable<SomeDataType>>() {
@Override
public Observable<SomeDataType> call(CharSequence s) {
// make network call and return your result here...
// returning null here as a substitute for actual data...
return null;
}
})
最后,除非我們訂閱了Observable
實例,否則什么也不會發生:
RxTextView.textChanges(companyIdsEditText)
.debounce(500, TimeUnit.MILLISECONDS)
.filter(new Func1<CharSequence,Boolean>() {
@Override
public Boolean call(CharSequence charSequence) {
return charSequence != null && charSequence.toString().length() >= 5;
}
})
.flatMap(new Func1<CharSequence,Observable<SomeDataType>>() {
@Override
public Observable<SomeDataType> call(CharSequence s) {
// make network call and return your result here...
// returning null here as a substitute for actual data...
return null;
}
})
.subscribe(
// onNext handler...
// onError handler...
// onComplete handler...
);
我希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.