2017-07-04 40 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()) 
    ));