setOnClickListener(this)的性能注意事项

时间:2014-07-29 19:39:47

标签: java android

在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的性能考虑......

有没有人对此有任何想法/经验?

2 个答案:

答案 0 :(得分:1)

后一种方法显然更有效:它所做的就是将对this(已存在的对象)的引用传递给setOnClickListener,然后将其用于调用onClick

第一种方法效率稍低,因为它创建了一个新对象,即匿名内部类的一个实例。新对象的创建和附加类的存在是主要区别。

在处理周围类和匿名内部类之间的变量事务时,您可能还会使用第一种方法产生一些开销。大多数问题,例如线程化相关问题,影响两种方法。

总结一下,没有真正的性能差异。如果要创建大量按钮,则应考虑共享View.OnClickListener的单个实例。

我通常更喜欢匿名内部类(最大限度),因为它将实际属于周围类的代码与与侦听器相关的代码分开。

监听器实现的实际内容将比调用setOnClickListener更多地影响性能方式。从setOnClickListener的角度来看,两个调用都是相同的,因为它们都传递实现View.OnClickListener的类的实例,无论是重用还是创建。

答案 1 :(得分:1)

我认为这两种方法都是有效的

一切都取决于你想做什么。例如,如果屏幕上有许多按钮,并且您选择使用第一个选项,则对于每个按钮,您需要一个新对象来处理点击。与第二个选项相比,使用与侦听器相同的对象(活动),您将消耗更少的资源,因为它将创建更少的对象(Java)。

另一方面,请记住该视图包含对上下文的引用。