2012-05-25 224 views
4

CEO或讓我們說我用一個if語句來解釋十個不同的可能按下按鈕即發送一個事件的價值的事件偵聽器:多個if語句

public boolean onTouch(int v) { //this is my only listener for all ten buttons 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
    if(v==button_one){pool.play(bass1, 1f,1f, 1, 0, 1f);} 
    if(v==button_two){pool.play(bass2, 1f,1f, 1, 0, 1f);} 
    if(v==button_three){pool.play(bass3, 1f,1f, 1, 0, 1f);} 
    if(v==button_four){pool.play(snare1, 1f,1f, 1, 0, 1f);} 
    if(v==button_five){pool.play(snare2, 1f,1f, 1, 0, 1f);} 
    if(v==button_six){pool.play(snare3, 1f,1f, 1, 0, 1f);} 
    if(v==button_seven){pool.play(hh1, 1f,1f, 1, 0, 1f);} 
    if(v==button_eight){pool.play(hh2, 1f,1f, 1, 0, 1f);} 
} 
return false; 
} 

難道是更有效地分類這些?說...一個onClick事件的陷阱,一個是低音,一個是hi帽子,這樣當按下按鈕時,程序不必通過每條if語句來計數,只有那個在偵聽器中的那個事件?

+1

我更喜歡這種方式,10個不同的聽衆如此簡單似乎過分。如果所有其他行在找到該按鈕後都不進行評估,那麼您可以做其他操作。 –

+0

但是這樣做,處理程序是否會在其他元素中調用'onTouch'事件? – Chopin

回答

0

我不會擔心打破了,直到你知道這是一個問題。開關將有助於減少重複的if聲明:

public boolean onTouch(int v) { 
    if(event.getAction() == MotionEvent.ACTION_DOWN) { 
    switch (v) { 
    case button_one: pool.play(); break; 
    case button_two: pool.play(..); break; 
    ... 
    } 
    } 
return false; 
} 
+0

本網站的反饋速度令我驚訝。我想我會選擇switch語句作爲選項,然後如果我決定加載更多的文件,如果它不重要,那麼我就可以放鬆一下。謝謝大家 – KendalH

5

這樣的事情呢?

HashMap<int,int> soundMap = new HashMap<int,int>(); 
soundMap.put(button_one, bass1); 
soundMap.put(button_two, bass2); 
soundMap.put(button_three, bass3); 
soundMap.put(button_four, snare1); 
soundMap.put(button_five, snare2); 
soundMap.put(button_six, snare3); 
soundMap.put(button_seven, hh1); 
soundMap.put(button_eight, hh2); 

有HashMap中爲類變量,並在的onCreate什麼初始化的映射。然後,你可以用這個監聽器:

public boolean onTouch(int v) { 
    if(event.getAction() == MotionEvent.ACTION_DOWN) { 
     pool.play(soundMap.get(v), 1f, 1f, 1, 0, 1f); 
    } 
    return false; 
} 

這樣做的好處是,如果你要在將來添加更多的按鈕,你只需要修改與新的聲音映射圖初始化方法;聽衆不需要任何改變。

0

在這種情況下,表現並不值得擔心;條件語句花費的時間將被周圍的事件處理代碼徹底淹沒。績效的第一到第三定律是衡量,衡量和衡量的標準,我對發現差異的可能性持懷疑態度。

我不禁注意到,唯一改變的是pool.play的第一個參數。 bass1,bass2等與相應的v值之間是否存在關係?

+0

不,池是一個包含所有聲音文件的數組,無論按哪個按鈕都取決於池播放哪個文件。第一個參數是與音頻文件相關的唯一參數,其他參數是音量,循環設置和浮點值,[我還沒完全理解浮點參數] – KendalH

+0

@ kcoppock的答案可能有一個有趣的變化你在那裏安排游泳池的ID與按鈕的ID相同。唉:這會是一種欺騙,這對於讓你感覺聰明但對可維護性來說不太好。大多數情況下,kcoppock說。 – Iain

+0

@伊恩:我喜歡這個主意。那肯定會是一個漂亮的解決方案。如果您可以添加與相關聲音ID相關的XML標籤,那就太好了,但我不知道有辦法做到這一點。 @KendalH:最後一個浮點參數是播放速度。 '1.0f'是1:1播放,你可以從'0.5f'(50%播放速度)到'2.0f'(200%播放速度) – kcoppock

0

我不認爲它的必要性,但我會definetly推薦開關和案例。您可以按照最常見或最不常見的順序進行訂購,但它的這種小變化不會被注意到。通過這些if語句並不需要很長時間。

0

我不知道這個if運行多少次,但對我來說似乎並不低效。這個布爾測試非常快。 無論如何,如果你想讓它儘可能高效,我看到兩個選項:

  1. 最簡單的一個:使用else if代替if
  2. 這個複雜的一個:使用ActionIf對象的數組做你想做什麼:

public interface ActionIf { 
    public void go(); 
} 

public class ActionBass1 implements ActionIf { 
    @Override 
    public void go() { 
     pool.play(bass1, 1f,1f, 1, 0, 1f); 
    } 
} 

public class ActionBass2 implements ActionIf { 
    @Override 
    public void go() { 
     pool.play(bass2, 1f,1f, 1, 0, 1f); 
    } 
} 

... 

public ActionIf[] actions = {new ActionBass1(), new Action Bass2(), ...); 

public boolean onTouch(int v) { //this is my only listener for all ten buttons 
    if(event.getAction() == MotionEvent.ACTION_DOWN && v >= 0 && v <= (button_eight-button_one)){ 
     actions[button_one+v].go(); 
    } 
    return false; 
} 

1

只需添加到建議和意見在這裏豐富的靜脈,和前約與所有同意「這真是一個性能問題「,我會選擇使代碼最容易閱讀和維護的結構,以及任何可能需要維護它的人。通過維護,還可以考慮擴展它。如果您想再添加5個音墊,3個月會發生什麼?

減少線路的最小數量可能會給你一些幾乎immeasaruble的性能提升,並保存在您的APK幾個字節,但在大多數情況下,我寧願拿,對於可讀性。

所有這一切,我喜歡kcoppocks的解決方案。對我來說,這短暫的甜美和優雅,以及我該怎麼做,但是,如果你的經驗水平不同,你不能只看它,並說「是的,我明白了」,然後保持你的ifs,或者更好,一個開關。