2015-11-27 87 views
1

我开始在我现有的应用程序中使用RxAndroid。我已经开始了一个非常简单的活动,我有一个搜索字段,并在文本更改时使用Retrofit联系API。我还想在开始新的请求之前取消当前未完成的请求。这是我到目前为止:改进请求取消RxJava

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 ...); 
      } 
     }); 

我觉得像存储订阅是不是真正的反应式编程兼容。我怎样才能以更标准的方式来做到这一点?

回答

4

无需创建新的订阅在这种情况下,每次,switchMap可以照顾从旧观察的退订当一个新来的事情是这样的:

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

+0

谢谢,那就是我一直在寻找的! –

+0

这会导致崩溃,如果API请求需要长时间(低连接)并且在完成之前触发新请求。我仍然java.io.InterruptedIOException:线程中断。 – Bresiu