我有一个SearchView,它执行网络请求以搜索一些轨道,然后用结果填充RecylerView。我发现此代码工作正常。

我已经通过适配器集成了RecyclerView EmptyView,但是现在我正在尝试将LoadingView(Progress)和ErrorView集成到此代码中。我试图在ConcatMap内将Visibility True上的LoadingView(ProgressBar)放在concatMap内,但得到了一个错误,即“只有创建视图层次结构的原始线程才能触摸其视图。”可以解决这一问题,但可以在MainThread上运行它有更好的方法可以做到这一点。

有人可以更好地了解在哪里以及如何将显示/隐藏ErrorView和LoadingView的逻辑集成到此代码中吗?

我也在使用RxBinding。也许还使用RxRecyclerView是个好主意?

 RxSearchView.queryTextChanges(searchView).
            filter(charSequence ->
                    !TextUtils.isEmpty(charSequence))
            .throttleLast(100, TimeUnit.DAYS.MILLISECONDS)
            .debounce(200, TimeUnit.MILLISECONDS)
            .onBackpressureLatest()
            .concatMap(searchTerm ->
                    {



                        return  searchTracks(searchTerm).
                                .subscribeOn(Schedulers.io())
                                .onErrorResumeNext(throwable1 -> {
                                            //handle error somehow, change UI

                                            return Observable.empty();
                                        }

                                );

                    }
            )
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(tracks -> {


                populateTracks(tracks);

                    }
                });


            }, throwable -> {

            //show errorView


            });

最佳答案

这是我的完整解决方案,没有剥离演示文稿的代码。

RxSearchView.queryTextChanges(searchView)
    .skip(1)
    .doOnNext(charSequence -> Log.v(TAG, "searching: " + charSequence))
    .throttleLast(100, TimeUnit.MILLISECONDS)
    .debounce(200, TimeUnit.MILLISECONDS)
    .onBackpressureLatest()
    .observeOn(AndroidSchedulers.mainThread())
    .filter(charSequence -> {
        final boolean empty = TextUtils.isEmpty(charSequence);
        if (empty) {
            Log.v(TAG, "empty view");
            mAdapter.clear();
        }
        return !empty;
    })
    .concatMap(charSequence -> {
        Log.v(TAG, "requesting " + charSequence);
        return onErrorResumeNext(
                mGitApiService.searchRepositoriesSingle(charSequence.toString())
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread()),
                throwable -> {
                    try {
                        throw throwable;
                    } catch (HttpException httpException) {
                        showEmptyErrorView(httpException.message());
                    } catch (Throwable other) {
                        showEmptyErrorView(other.getMessage());
                        other.printStackTrace();
                    }
                    return Observable.empty();
                });
    })
    .doOnNext(charSequence -> Log.v(TAG, "got data"))
    .subscribe(response -> {
        showRepositories(response.getItems());
    }, throwable -> {
        throwable.printStackTrace();
        showEmptyErrorView(throwable.getMessage());
    });


因此,基本上,每当您触摸视图时,都必须调用.observeOn(AndroidSchedulers.mainThread())

10-08 16:42