假设我说我正在使用一个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事件和一个用于低音的onClick和一个用于嗨帽子的事件,这样当按下一个按钮时,程序不必计算每个if语句,只有一个是在被调用者的监听器内事件
答案 0 :(得分: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;
}
这样做的好处是,如果将来必须添加更多按钮,则只需使用新的声音映射修改地图初始化方法;听众不需要任何改变。
答案 1 :(得分:1)
只是为了在这里添加丰富的建议和意见,并在之前同意所有关于“这真的是一个性能问题”,我会寻求使代码最易于阅读和维护的结构,以及其他可能需要维护它的人。通过维护,还要考虑扩展它。如果你想再增加5个音垫,会在3个月内发生什么?
减少到最小行数可能会给你一些几乎不可估量的性能提升,并在你的APK中节省几个字节,但在大多数情况下,为了便于阅读,我会交换它。
所有这一切,我确实喜欢kcoppocks的解决方案。对我来说,这是短暂的甜蜜和优雅,我会怎么做,但是,如果你的经验水平不同,你不能只看它并说“啊,是的,我得到它”,然后保持你的ifs,或者更好,一个开关。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
在这种情况下,表现并不值得担心。条件语句所花费的时间将由围绕它的事件处理代码彻底相形见绌。第一到第三个绩效定律是衡量,衡量,衡量,而且我对找到差异的可能性持怀疑态度。
我不禁注意到,唯一改变的是pool.play的第一个参数。 bass1,bass2等与相应的v值之间是否存在关系?
答案 4 :(得分:0)
我不认为它是必要的,但我肯定会推荐开关和案例。你可以订购最常见的最不常见的但它的这么小的改变,不会被注意到。完成那些if语句并不需要很长时间。
答案 5 :(得分:0)
我不知道这个if
运行了多少次,但这对我来说似乎效率不高。这个布尔测试非常快。
无论如何,如果你想尽可能提高效率,我会看到两个选择:
else if
代替if
。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;
}
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;
}