如何优化我的代码来处理这个特殊事件

时间:2013-09-19 07:57:23

标签: java swing java-ee

我的程序监听3种类型的事件:ADD,DELETE,REFRESH,它由UI上的第三方库组件触发。我的听众看起来像这样:

//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上发生刷新时,第三方lib组件会在短时间内连续发出3个事件,即:ADD-> DELETE-> REFRESH,在这种情况下我的监听器认为有3个事件,但实际上是只对UI进行刷新操作。

如何优化我的代码,以便在ADD-> DELETE-> REFRESH连续快速发生时,我的听众可能足够聪明,知道它只是一个REFRESH?

(ADD和DELETE事件是 NOT REFRESH事件的实例)

3 个答案:

答案 0 :(得分:2)

正如我在评论中已经说过的那样,我在下面发布的代码片段正在工作(测试过)。您可能需要对REFRESH_TIMEOUT进行一些调整,并可能使其成为线程安全的,但我已经测试了基本想法:

“如果有ADD事件,请为它创建一个计时器。当DELETE到来时,检查是否已经有时间任务。如果不是 - >处理DELETE。如果有 - >处理REFRESH。如果计时器到期 - >处理ADD“

这有点像黑客,但根据你提供的信息,我认为这个解决方案可能是最简单的方法。如果正确的事件变得更快,您可能会遇到问题,那么您的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){
    ...
}

答案 1 :(得分:2)

经过一番思考后,我提出了自己的解决方案:

这是在ADD&删除条件,我使用Thread.sleep(1000),然后获取系统时间,之后我比较最新系统时间get REFRESH条件,如果差异在1秒内,那么它是刷新事件。

private long timeout = 1000;
private long addEventTime;
private long deleteEventTime;
private long refreshEventTime;

public void listenToEvent(Event event, long timestamp){
     if(event.getName().equals("ADD")){
           Thread.sleep(timeout);
           addEventTime = System.currentTimeMillis();
           if((refreshEventTime - addEventTime) >timout){
               //handle ADD event
            }


     }else if(event.getName().equals("DELETE")){
           Thread.sleep(timeout);
           deleteEventTime = System.currentTimeMillis();
           if((refreshEventTime - deleteEventTime) >timout){
               //handle DELETE event
            }


    }else if(event.getName().equals("REFRESH")){
          refreshEventTime = System.currentTimeMillis();
          //handle REFRESH event

    }

}

任何大师对我的解决方案有任何评论吗?

答案 2 :(得分:0)

如果事件api被认为是imo,我认为ADD事件可能是REFRESH事件的一个实例。

这方面的一个例子是:

//AccidentAPI provided by FooBar Corp.
public CarAccidentEvent extends AccidentEvent {

    private String carMake;

    public String getMake() {
        return carMake;
    }
}

所以,你的听众能够做到这样的事情:

public void listenToAccidents(AccidentEvent e) {

    if (e instanceOf CarAccidentEvent) {
         doStuff();
    } else if (e instanceOf SkyJumpingEvent) {
         doOtherStuff();
    } else {
         blah();
    }
}

但同样,这是假设ADD和DELETE事件是REFRESH事件的实例。虽然,或许他们的文档会揭示有关EventAPI的更多信息,可能有助于更好地解决问题。

否则,您可以为Millis中系统的时间添加三个属性,如果Millis中的时间差大于1ms,则处理它,否则,转到REFRESH情况。