我在我的应用程序中进行搜索系统。我订阅了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" 订阅后即可使用。但对于其他符号,订阅将无效。
存在哪种解决方案?
答案 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())
));