我怎样才能订阅最后的数据?

How can i get subscribe to only last data?

我正在我的应用程序中做搜索系统。我订阅了 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 的帮助下只处理最后的数据吗?

示例:用户快速输入字符串:"Example" 并在输入符号 "e" 后订阅将起作用。但对于其他符号订阅将不起作用。

存在什么样的问题解决方案?

有一种方法 debounce() 可用于延迟项目的发射,直到在原始事件之后发生超时。

这意味着:只要用户键入,就会发出新事件,从而丢弃旧事件。当用户停止输入时,将达到超时并向订阅者发送最后一个事件。

我创建了 class 谁在每个设定的时间段发送一次新数据。

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

class你自己每期发送一次新数据。

变体 #2:

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