簡體   English   中英

如何累積多個可觀察物並在一段時間后發出最新信號(去抖動)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM