2015-11-27 114 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