改进RxJava中的请求取消

gui*_*tgl 1 android retrofit rx-android

我在我现有的应用程序中开始使用RxAndroid.我从一个非常简单的活动开始,我有一个搜索字段,当文本发生变化时,我会使用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 ...);
            }
        });
Run Code Online (Sandbox Code Playgroud)

我觉得存储订阅并不是真正的响应式编程.我怎么能以更标准的方式做到这一点?

And*_*dEx 5

在这种情况下,无需每次都创建一个新的订阅,switchMap当新的进入时,可以负责从旧的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 ...*/);
Run Code Online (Sandbox Code Playgroud)

也是很好的例子.