Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用RxJava更新RecyclerView上的UI(加载和错误视图)_Android_Android Recyclerview_Retrofit_Rx Java_Rx Android - Fatal编程技术网

Android 使用RxJava更新RecyclerView上的UI(加载和错误视图)

Android 使用RxJava更新RecyclerView上的UI(加载和错误视图),android,android-recyclerview,retrofit,rx-java,rx-android,Android,Android Recyclerview,Retrofit,Rx Java,Rx Android,我有一个SearchView,它执行一个网络请求来搜索一些曲目,然后用结果填充RecylerView。我发现这个代码很好用 我已经通过适配器集成了RecyclerView EmptyView,但现在我正在尝试在代码中集成LoadingView(Progress)和ErrorView。我试图将LoadingView(ProgressBar)设置为concatMap中的Visibility True,但得到的错误是“只有创建视图层次结构的原始线程才能接触其视图”。在主线程上运行该设置可以解决这个问题

我有一个SearchView,它执行一个网络请求来搜索一些曲目,然后用结果填充RecylerView。我发现这个代码很好用

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

有人能更好地了解显示/隐藏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())

这是我的完整解决方案,无需剥离演示文稿的代码

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())

您有权访问此处的活动吗?如果是,您的朋友是否有权参加这里的活动?如果是这样的话,那么你的朋友基本上是这样的,只要你接触你的视图,你就必须调用。observeOn(AndroidSchedulers.mainThread())部分应该突出显示,因为这是最重要的事情。基本上,当您与其他人打交道时,您应该处于同一个线程中。这种情况下,debounce位于计算线程中,但视图位于主线程中。因此,基本上每当您触摸视图时,您都必须调用。observeOn(AndroidSchedulers.mainThread())部分应突出显示,因为这是最重要的事情。基本上,当你们处理彼此的问题时,你们应该在同一个线程中。这种情况下,debounce位于计算线程中,但视图位于主线程中。