我的程序监听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事件的实例)
答案 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情况。