android - 使用 RxJava 在 RecyclerView 上更新 UI(加载和错误 View )

标签 android android-recyclerview retrofit rx-java rx-android

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

我已经通过适配器集成了 RecyclerView EmptyView,但现在我正在尝试将 LoadingView(Progress) 和 ErrorView 集成到这段代码中。我试图将 LoadingView(ProgressBar) 置于 concatMap 内的 Visibility True 上,但出现“只有创建 View 层次结构的原始线程才能触及其 View ”的错误。这可以在 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());
    });

所以基本上每当你触摸你的 View 时,你都必须调用 .observeOn(AndroidSchedulers.mainThread())

关于android - 使用 RxJava 在 RecyclerView 上更新 UI(加载和错误 View ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33501403/

相关文章:

java - 如何在 RecyclerView 中添加搜索过滤器来过滤解析的 JSON 数据?已编辑

android - 使用 Espresso 在 RecyclerView 项目中单击 View

android - 如何模拟 Retrofit Response

android - 从 Git 导入时找不到名称为 'default' 的配置

android - OrderByKey 工作正常,但 OrderByChild 在 firebase 实时数据库中给出了意想不到的结果

android - 在 Android 中使用 OpenCV 时遇到问题

java - 带有改造 2.0 的 POST

android - 使用 RxJava2 和普通空响应错误进行改造 2

android - 连接 Firebase 和 Carto

android - Android 中的图库相册列表