【问题标题】:Combine RxTextView text change events with Retrofit call将 RxTextView 文本更改事件与 Retrofit 调用相结合
【发布时间】:2017-02-10 13:34:42
【问题描述】:

我是RxJava 的新手,我只是尝试实现一些示例以更好地理解发生了什么,所以我认为EditText 是一个可观察的并使用RxBinding 发出textChangeEvents图书馆:

        RxTextView.textChangeEvents(searchbar.getEditText())
            .debounce(400, TimeUnit.MILLISECONDS)
            .filter(new Func1<TextViewTextChangeEvent, Boolean>() {
                @Override
                public Boolean call(TextViewTextChangeEvent text) {
                    return (text.text().length() > 2);
                }
            })
            .subscribeOn(AndroidSchedulers.mainThread())
            .observeOn(Schedulers.io());

还有一个Retrofit api 调用,其中调用的文本来自上面的Observable

所以我已经声明了一个函数:

@Override
public Observable<SearchResponse> executeSearch(Observable<RxTextView> queryText) {
    return searchService.getSearch(queryText)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());
}

现在我必须将这两者结合起来,所以当文本更改时,会有一个新的Retrofit 调用,但我不知道如何将queryText“传递”给服务。

我也试过了:

Observable<TextViewTextChangeEvent>  
    searchBarText = RxTextView.textChangeEvents(searchbar.getEditText())
            .debounce(400, TimeUnit.MILLISECONDS)
            .filter(new Func1<TextViewTextChangeEvent, Boolean>() {
                @Override
                public Boolean call(TextViewTextChangeEvent text) {
                    Timber.i("Executes!!! text : %s", text.text().toString());
                    return (text.text().length() > 2);
                }
            })
            .subscribeOn(AndroidSchedulers.mainThread())
            .observeOn(Schedulers.io());

    Observable.combineLatest(executeSearchTypeOne(searchBarText), executeSearchTypeTwo(searchBarText),
                    new Func2<TypeOne, TypeTwo, Object>() {
                        @Override
                        public Object call(TypeOne one, TypeTwo two) {

                            return null;
                        }
                    })
            .subscribe(new Action1<Object>() {
                @Override
                public void call(Object o) {
                    Timber.i("WORKS!!!");
                }
            });

我想根据EditText 更改同时运行两个Retrofit 调用,但它们根本不运行

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    我假设 searchService.getSearch queryText 参数的类型是字符串,并返回一个 Observable 的数据。

    我会这样写:

    RxTextView.textChangeEvents(searchbar.getEditText())
            .debounce(400, TimeUnit.MILLISECONDS)
            .map(new Func1<TextViewTextChangeEvent, String>() {
                @Override
                public String call(TextViewTextChangeEvent text) {
                    return text.text().toString();
                }
            })
            .filter(new Func1<String, Boolean>() {
                @Override
                public Boolean call(String text) {
                    return (text.length() > 2);
                }
            })
            .flatMap(new Func1<String, rx.Observable<Data>>() {
                @Override
                public rx.Observable<Data> call(String text) {
                    return getSearch(text);
                }
            })
            .subscribeOn(Schedulers.io()) // Or Schedulers.newThread()
            .observeOn(AndroidSchedulers.mainThread());
    

    这是一个Data的Observable,从TextViewTextChangeEvent的一个Observable映射到String到getSearch链上,一个Observable Data。

    对于 Kotlin(Killer 的初步提议):

    RxTextView.textChangeEvents(searchbar.getEditText())
                    .debounce(400, TimeUnit.MILLISECONDS) // Better store the value in a constant like Constant.DEBOUNCE_SEARCH_REQUEST_TIMEOUT
                    .map { it.text().toString() }
                    .filter { it.length > 2 }
                    .flatMap { getSearch(it) } // Or .flatMap(this::getSearch)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe { ... }
    

    注意:一旦 onError() 方法运行,RxTextView.textChanges 将不会发出文本更改。参考:https://github.com/JakeWharton/RxBinding/issues/272

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2019-03-11
      相关资源
      最近更新 更多