Android 使用RxJava更新RecyclerView上的UI(加载和错误视图)
我有一个SearchView,它执行一个网络请求来搜索一些曲目,然后用结果填充RecylerView。我发现这个代码很好用 我已经通过适配器集成了RecyclerView EmptyView,但现在我正在尝试在代码中集成LoadingView(Progress)和ErrorView。我试图将LoadingView(ProgressBar)设置为concatMap中的Visibility True,但得到的错误是“只有创建视图层次结构的原始线程才能接触其视图”。在主线程上运行该设置可以解决这个问题,但我确信有更好的方法来实现这一点 有人能更好地了解显示/隐藏ErrorView和LoadingView的逻辑在何处以及如何集成到此代码中吗 我也在使用RxBinding。也许使用RxRecyclerView也是个好主意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,但得到的错误是“只有创建视图层次结构的原始线程才能接触其视图”。在主线程上运行该设置可以解决这个问题
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位于计算线程中,但视图位于主线程中。