我的程序监听 3 种类型的事件:ADD、DELETE、REFRESH,这些事件由 UI 上的第 3 方库组件触发。我的听众看起来像这样:
//the timestamp is the time when the event occurs
public void listenToEvent(Event event, long timestamp){
if(event.getName().equals("ADD")){
//handle ADD event
}else if(event.getName().equals("DELETE")){
//handle DELETE event
}else if(event.getName().equals("REFRESH")){
//handle REFRESH event
}
}
该代码对于每个事件都工作正常,除了 REFRESH 事件有一点问题:
当 UI 上发生刷新时,第 3 方 lib 组件会在短时间内连续触发 3 个事件,即:ADD->DELETE->REFRESH,在这种情况下,我的监听器认为有 3 个事件,但实际上它只是一个UI 上的刷新操作。
如何优化我的代码,以便当 ADD->DELETE->REFRESH 非常快地连续发生时,我的监听器可以足够聪明地知道这只是一个 REFRESH?
(ADD 和 DELETE 事件不是 REFRESH 事件的实例)
最佳答案
正如我在评论中已经说过的,我在下面发布的这段代码正在运行(经过测试)。您可能需要对 REFRESH_TIMEOUT 进行一些调整,并可能使其成为线程安全的,但我已经测试了基本想法:
“如果ADD事件到来,则为其创建一个定时器。当DELETE到来时,检查是否已经有定时器任务。如果没有->处理DELETE。如果有->处理REFRESH。如果定时器到期->处理添加”
这有点像黑客,但根据您提供的信息,我认为这个解决方案可能是最简单的事情。如果正确的事件来得比 REFRESH_TIMEOUT 快,您可能会遇到问题。在这种情况下,逻辑会变得有点复杂。
long REFRESH_TIMEOUT=100;
Timer timer = null;
MyTask myTask = null;
public void listenToEvent(Event event, long timestamp){
if(event.getName().equals("ADD")){
timer = new Timer();
timer.schedule(myTask = new MyTask(event), REFRESH_TIMEOUT);
}
if(event.getName().equals("DELETE")){
if (myTask!=null && !myTask.expired){
processRefresh(event);
timer.cancel();
}else{
processDelete(event);
}
}
}
private static class MyTask extends TimerTask {
Event event;
boolean expired;
public MyTask(Event event){
this.event=event;
}
@Override
public void run() {
expired=true;
processAdd(event);
}
}
private void processAdd(Event e){
...
}
private void processDelete(Event e){
...
}
private void processRefrsh(Event e){
...
}
关于java - 如何优化我的代码来处理这个特殊事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18889141/