2012-05-25 5 views
4

гипотетически допустим я использую один, если заявление для учета десяти возможных нажатий кнопок, которые посылают значение события на слушателя событий:Multiple если заявления

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

Нет, пул - это массив со всеми загруженными в него звуковыми файлами, так что любая кнопка, которую вы нажимаете, зависит от того, какой файл играет пул. Первый параметр является единственным параметром, относящимся к аудиофайлам на выбор, остальные - томами, настройкой цикла и значением с плавающей запятой, [я еще не полностью понял параметр float] – KendalH

+0

Может быть интересная вариация ответа @ kcoppock где вы упорядочиваете идентификаторы пула такими же, как и кнопки. Увы: это был бы трюк, который хорош для того, чтобы вы чувствовали себя умными, но гораздо менее хорошими для ремонтопригодности. В основном, что сказал kcoppock. – Iain

+0

@Iain: Мне нравится идея; это было бы отличным решением. было бы неплохо, если бы вы могли добавить тег в XML, связанный с соответствующим идентификатором звука, но я не знаю, что есть способ сделать это. @KendalH: последним параметром float является скорость воспроизведения. '1.0f' - воспроизведение 1: 1, вы можете перейти от' 0.5f' (скорость воспроизведения 50%) к '2.0f' (200% скорость воспроизведения) – kcoppock

0

Я не думаю, что это необходимо, но я бы определенно рекомендовал выключатель и корпус. Вы можете заказать как наиболее распространенные, наименее распространенные, но такие небольшие изменения, которые не будут замечены. Это не занимает очень много времени, чтобы пройти через те заявления 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

Просто, чтобы добавить к богатой вене советов и мнения здесь, и согласованию со всеми ранее о " это действительно проблема производительности », я бы пошел на структуру, которая делает код проще всего читать и обслуживать вас, и всех, кому может понадобиться его поддерживать. При обслуживании, подумайте также о его расширении. Что происходит через 3 месяца, когда вы хотите добавить еще 5 звуковых колодок?

Уменьшение минимального количества строк может дать вам почти неизмеримое повышение производительности и сохранить несколько байтов в вашем APK, но в большинстве случаев я бы обменял его на удобочитаемость.

Все, что сказал, мне нравится решение kcoppocks. для меня это короткое сладкое и элегантное, и как бы я это сделал, но, если ваш уровень опыта отличается, и вы не можете просто взглянуть на него и сказать «да, я понял», а затем сохранить ваше ifs или лучше, переключатель.

Смежные вопросы