java - 处理RxJava即时搜索时中断异常

标签 java android rx-java rx-java2 rx-android

我正在使用 RxJava 实现即时搜索。

问题:用户开始在搜索 EditText 上输入一些文本。用户暂停了一会儿。它通过了debounce操作条件。请求过程开始,但在获取最后一个请求的结果之前,用户开始输入更多字符或更改最后一个文本,现在将引发 java.io.InterruptedIOException 。 Observer 中的 onError 将被调用,搜索 EditText Observable 也将被释放,因此更改当前文本不再有任何效果,并且不会发生任何事情,因为 observable 已被释放。

预期行为:取消之前的请求并继续使用用户的新输入进行搜索。

代码:

        RxTextView.textChanges(etSearch)
                .skip(1)
                .map(CharSequence::toString)
                .doOnNext(this::handleSearchViewsVisibilityOnTextChange)
                .filter(string -> string.length() >= MIN_CHAR_TO_SEARCH)
                .debounce(SEARCH_QUERY_DELAY, TimeUnit.MILLISECONDS)
                .switchMap(this::search)
                .distinctUntilChanged()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(searchObserver);
    class SearchObserver implements Observer<Result> {

        @Override
        public void onNext(Result result) {

            if (result.getItemsCount() > 0) {
                resultList = result.getItemsList();
            } else {
                // No result
                resultList = new ArrayList<>();
            }
            searchAdapter.updateData(resultList);
        }

        @Override
        public void onError(Throwable throwable) {
            throwable.printStackTrace();
            List<Result> emptyData = Collections.emptyList();
            if (!isFinishing()) {
                searchAdapter.updateData(emptyData);
            }
        }
    }

最佳答案

您可以使用retryWhen像这样的东西:

      RxTextView.textChanges(etSearch)
                .skip(1)
                .map(CharSequence::toString)
                .doOnNext(this::handleSearchViewsVisibilityOnTextChange)
                .filter(string -> string.length() >= MIN_CHAR_TO_SEARCH)
                .debounce(SEARCH_QUERY_DELAY, TimeUnit.MILLISECONDS)
                .switchMap(this::search)
                .distinctUntilChanged()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .retryWhen((errors) -> {
                    errors.flatMap((error) -> {
                       error instanceof java.io.InterruptedIOException ? Observable.empty() : Observable.error(error)
                    }
                 })
                .subscribe(searchObserver);

关于java - 处理RxJava即时搜索时中断异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57463549/

相关文章:

Java 八进制到二进制的转换(没有预定义的方法)

java - mvn测试并编译

android - 仪表:控制生命周期

android - 使用 RxJava 获取对象,转换包含列表,并使用列表

java - kundera-cassandra 中的交易

java - 当 AsyncTask 也使用另一个线程时如何设置延迟时间?

java - 为 Android 构建电话间隙应用程序失败

android - 从 URI 加载图像作为布局背景

android - 使用 Retrofit 和 RxJava 从 Android 中的 JSON 数组中一一获取 JSON 对象

rx-java - 在 rxjava 中为 "else"或 "coallesce"链接可能