android - 如何创建 Rx 搜索 View 来使用查询过滤回收器 View

标签 android rx-java

我想实现一个 Rx 搜索 View ,它将使用字符串过滤回收器 View ,并检查本地领域数据库并发出改造请求,然后组合所有结果而不重复?因此,换句话说:我想在搜索 View 中的文本更改事件上,使用输入字符串发出网络请求、数据库查询并与不重复的结果合并

这是我的初始代码:

RxSearchView.queryTextChanges(searchView)
            .filter(charSequence -> !TextUtils.isEmpty(charSequence))
            .throttleLast(100, TimeUnit.MILLISECONDS)
            .debounce(200, TimeUnit.MILLISECONDS)
            .onBackpressureLatest()
            .flatMap(charSequence -> userListPresenter.search(charSequence))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .onErrorResumeNext(Observable.empty())
            .subscribe((Action1) response -> userListPresenter.showSearchResult((List<UserModel>) response));

userListPresenter.search(charSequence)) 应该返回一个没有重复的串联响应的可观察值,谢谢:)

userListPresenter.search(charSequence)):

Observable.create(subscriber -> {
        if (Utils.isNetworkAvailable(getContext())) {
            if (!subscriber.isUnsubscribed()) {
                subscriber.onNext(restApi.search(query));
                subscriber.onCompleted();
            }
        }).mergeWith(
                    Observable.create(subscriber -> {
        if (!subscriber.isUnsubscribed()) {
            subscriber.onNext(realmManager.getWhere(query));
            subscriber.onCompleted();
        }
    })).collect(HashSet::new, HashSet::add)
            .flatMap(Observable::from);

最佳答案

如果我正确理解了你的问题。有一个很好的方法来组合多个 Observables 的排放,看看 zip method 。 因此,您的搜索方法将如下所示:

public Observable<List<MyItem>> search(CharSequence query) {
    return Observable.zip(
                observeNetwork(query),
                observeRealm(query),
                new Func2<List<MyItem>, List<MyItem>, List<MyItem>>() {
                    @Override
                    public List<MyItem> call(List<MyItem> networkResult, List<MyItem> databaseResult) {
                        return merge(networkResult,databaseResult);
                    }
                }
            );
}

private Observable<List<MyItem>> observeRealm(CharSequence searchString) {
    return Observable.create( /* do your realm stuff */);
}

private Observable<List<MyItem>> observeNetwork(CharSequence searchString) {
    return return Observable.create( /* do your network stuff */);
}

private List<MyItem> merge(List<MyItem> networkResult, List<MyItem> databaseResult) {
    List<MyItem> result = new ArrayList<>();
    result.addAll(databaseResult);
    for(MyItem newItem : networkResult){
        if(!databaseResult.contains(newItem)){
            result.add(newItem);
        }
    }
    return result;
}

关于android - 如何创建 Rx 搜索 View 来使用查询过滤回收器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375640/

相关文章:

java - 响应式(Reactive)编程中的订阅是什么

java - RxJava,如果存在则获取第一项

android - 使用 ACTION_CAPTIVE_PORTAL_SIGN_IN

android - 我试图在 ionic 中添加 android 平台但它不起作用,它显示错误

android - 如何将 inflatedView 添加到线性布局

clojure - rxjava 和 clojure 异步之谜 : futures promises and agents, 哦天哪

java - 如何将Android中的LocationResult类转换为Location类?

java - 如何禁用另一个 Activity 中的按钮?

android - 如何使用 rxjava + retrofit2 编写嵌套网络请求

rx-java - 链接具有不同发射类型的多个可观察量