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

时间:2017-07-04 08:00:20

标签: java android rx-java rx-android event-bus

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

示例:用户快速输入字符串:"示例"输入符号" e" 订阅后即可使用。但对于其他符号,订阅将无效。

存在哪种解决方案?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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())
    ));