簡體   English   中英

如何優化我的代碼以處理此特殊事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM