在Android / Java中,如果我有一个按钮,我可以通过两种方式添加点击监听器 -
1)
Button button = findViewById(R.id.my_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
- 或 -
2)
Button button = findViewById(R.id.my_button);
button.setOnClickListener(this);
我有时更喜欢选项#2,主要是因为简洁,但我很好奇基本上将整个类/上下文传递给Listener的性能考虑......
有没有人对此有任何想法/经验?
答案 0 :(得分:1)
后一种方法显然更有效:它所做的就是将对this
(已存在的对象)的引用传递给setOnClickListener
,然后将其用于调用onClick
。
第一种方法效率稍低,因为它创建了一个新对象,即匿名内部类的一个实例。新对象的创建和附加类的存在是主要区别。
在处理周围类和匿名内部类之间的变量事务时,您可能还会使用第一种方法产生一些开销。大多数问题,例如线程化相关问题,影响两种方法。
总结一下,没有真正的性能差异。如果要创建大量按钮,则应考虑共享View.OnClickListener
的单个实例。
我通常更喜欢匿名内部类(最大限度),因为它将实际属于周围类的代码与与侦听器相关的代码分开。
监听器实现的实际内容将比调用setOnClickListener
更多地影响性能方式。从setOnClickListener
的角度来看,两个调用都是相同的,因为它们都传递实现View.OnClickListener
的类的实例,无论是重用还是创建。
答案 1 :(得分:1)
我认为这两种方法都是有效的
一切都取决于你想做什么。例如,如果屏幕上有许多按钮,并且您选择使用第一个选项,则对于每个按钮,您需要一个新对象来处理点击。与第二个选项相比,使用与侦听器相同的对象(活动),您将消耗更少的资源,因为它将创建更少的对象(Java)。
另一方面,请记住该视图包含对上下文的引用。