我有一个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())