匿名监听器会增加堆大小吗?

3

我在想使用匿名监听器是否是一个好的实践?

例如,我有一个包含50个项目的列表。每个项目都有一个使用匿名监听器实现的onClickListener。这是否意味着我要在堆中创建50个新项目?

for (x;x;x) {
   item.setOnClickListener(new OnClikListener() {
      ...
    });
}

如果我只创建一个侦听器对象,然后将这50个列表项分配给该单个侦听器,那么效率会更高吗?

OnClickListener listener = new OnClickListener() {
   ...
};

for (x;x;x) {
   item.setOnClickListener(listener);
}

2
请参考Android性能指南中的避免创建不必要的对象 - zapl
3个回答

3
无论是否匿名,创建的每个对象实例都存储在堆上。如果您可以为多个按钮重复使用相同的监听器,则一定要这样做:它将需要更少的内存,并且会生成更少的垃圾。

2

是的,有一个简单的规则:每次执行new都会创建一个新对象。即使你实例化的类是匿名的,也不会改变这个规则。

如果创建的对象都是相同的(即没有关闭某些可变变量),那么用单个共享实例替换它们是一个好主意。


0

1) 是的,这需要时间。实际上,你不仅要创建监听器作为对象,还要创建它们作为类(但这些类已经编译好了)。

2) 是的,这将更有效率。话虽如此,除非你的监听器需要大量资源,否则它不会显著提高性能。请决定是否值得增加代码复杂度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接