[英]How to optimize my code to handle this special event
我的程序偵聽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。如果計時器到期,則->處理ADD”
這有點hack,但是根據您提供的信息,我認為此解決方案可能是最簡單的方法。 如果適當的事件來得比您的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){
...
}
經過一番思考,我想出了自己的解決方案:
那是在ADD&DELETE條件下,我使用Thread.sleep(1000),然后獲取系統時間,此后,我比較在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
}
}
任何大師對我的解決方案有何評論?
如果事件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情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.