android - 改进 RxJava 中的请求取消

标签 android retrofit rx-android

我开始在我现有的应用程序中使用 RxAndroid。我从一个非常简单的 Activity 开始,我有一个搜索字段,并在文本更改时使用 Retrofit 联系 API。我还想取消当前未完成的请求(如果有的话),然后再开始新的请求。这是我目前所拥有的:

private Subscription currentRequestSubscription = null;

// Create stream of filtered queries
Observable<String> queryObservable = RxTextView.textChanges(searchView)
            .startWith("")
            .debounce(DELAY_BEFORE_REQUEST, TimeUnit.MILLISECONDS)
            .map(new Func1<CharSequence, String>() {
                @Override
                public String call(CharSequence charSequence) {
                    return charSequence.toString();
                }
            })



// Make search request and update UI
queryObservable.observeOn(Schedulers.io())
        .subscribe(new Action1<String>() {
            @Override
            public void call(String query) {
                if (currentRequestSubscription != null) {
                    currentRequestSubscription.unsubscribe();
                }

                currentRequestSubscription = createAPIRequestObservable(query)
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(... update UI with results ...);
            }
        });

我觉得存储订阅并不真正符合响应式编程。我怎样才能以更标准的方式做到这一点?

最佳答案

在这种情况下不需要每次都创建一个新的订阅,switchMap 可以在有新的 observable 时负责取消对旧的 observable 的订阅。像这样:

currentRequestSubscription = RxTextView.textChanges(searchView)
        .observeOn(Schedulers.io())
        .startWith("")
        .debounce(DELAY_BEFORE_REQUEST, TimeUnit.MILLISECONDS)
        .map(CharSequence::toString)
        .switchMap(text -> createAPIRequestObservable(text).subscribeOn(Schedulers.io()))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(/*... update UI with results ...*/);

也不错example .

关于android - 改进 RxJava 中的请求取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33961585/

相关文章:

java - 如何创建订阅可观察对象的BehaviorSubject?

android - 使用 Retrofit 2 和 Rx 在 Scheduler.Worker 线程上抛出致命异常

java - 返回 MembersInjectors.injectMembers 时出错

java - 从 Observable<List<String>> 返回 List<String>

android - 更新自定义 Android 应用程序

android - 圆形页面指示器 - 如何更改填充颜色

android - 为什么更新 PreferenceManager 不会触发 Jetpack Compose 中的重组?

java - 将 pcm 转换为 .wav - 有噪音

java - Retrofit 2 中是否有 RequestInterceptor 的替代品?

Java Retrofit 多请求单响应