我怎样才能订阅最后的数据?
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())
));
我正在我的应用程序中做搜索系统。我订阅了 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())
));