2017-07-04 69 views
0

我正在做我的應用程序搜索系統。我訂閱的EventBusEvent我怎樣才能訂閱只有最後的數據?

addSubscription(TheApplication.getEventBus().observe(UpdateSearchResults.class).subscribe(event -> 
     getViewModel().setParameter(event.getText()) 
    )); 

事件:

public class UpdateSearchResults 
{ 
    public UpdateSearchResults(String text) 
    { 
     this.text = text; 
    } 

    public String getText() 
    { 
     return text; 
    } 

    private String text; 
} 

而每一次,當用戶輸入新的符號。我發送這樣的事件:

TheApplication.getEventBus().post(new UpdateSearchResults(newText)); 

我可以幫助rxJava只處理最後的數據嗎?

例如:用戶輸入字符串fast:「示例」後輸入符號「e」訂閱將起作用。但對於其他符號訂閱不起作用。

問題存在哪些解決方案?

+0

@tynn我不知道。也許有一些RX功能在其中發送時間段,並且當訂閱者的時間段結束時會落入最後發送的事件 –

回答

3

有一種方法debounce()可用於延遲項目的發射,直到原始事件發生超時。

這意味着:只要用戶鍵入,新的事件將被髮射,因此舊的事件將被丟棄。當用戶停止輸入時,將達到超時以及發送給用戶的最後一個事件。

0

我創建了每個設定時間段發送一次新數據的類。

public class EventSendOnPeriod 
{ 
    public EventSendOnPeriod(Long period) 
    { 
     this.period = period; 
     this.isChange = false; 

     handler = new Handler(); 
     Runnable runnable = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       try 
       { 
        if (isChange) 
        { 
         TheApplication.getEventBus().post(new UpdateSearchResults(text)); 
        } 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
       finally 
       { 
        handler.postDelayed(this, period); 
        isChange = false; 
       } 
      } 
     }; 
     runnable.run(); 
    } 

    public void sendEvent(String text) 
    { 
     this.text = text; 
     isChange = true; 
    } 

    private final Long period; 
    private String text; 
    private Boolean isChange; 
    private final Handler handler; 
} 

它的使用非常簡單。您應該只使用:

eventSendOnPeriod.sendEvent(newText); 

這個類每個時間段一次發送新數據。

變#2:

addSubscription(TheApplication.getEventBus().observe(UpdateSearchResults.class).debounce(500, TimeUnit.MILLISECONDS).subscribe(event -> 
     getViewModel().setParameter(event.getText()) 
    ));