我们应该使用匿名类还是内部命名类作为 OnClickListener?

7

我在我的Activity中有很多按钮,我有以下几个问题:

  1. Should I create multiple inner anonymous classes for OnClickListeners for each button, like below:

    private View.OnClickListener mShuffleListener = new View.OnClickListener() {
        public void onClick(View v) {
            /// task to do
        }
    };
    
  2. Or should I go for a named inner class and add an if condition to check which click listener was called.

哪种方法更好地节省内存资源?

1
随便你!!……如果你想要一个结构良好的代码,我建议使用命名内部类。 - Shashank Kadne
4个回答

7

哪一个更节省内存资源?

这几乎没有什么区别。最多只有1个字...这是将静态内部类与(非静态)匿名类进行比较。即使您有成百上千个这些按钮,如此微小的节省也不值得付出代码可读性/可维护性的代价(在我看来)。


我在一个活动中有近15个按钮,如果定义15个匿名类,则将占用158字节的内存引用。如果使用命名内部类并实现clicklistener,则可以节省近148字节的空间。你认为呢? - AAnkit
3
  1. 只有当它们是“静态的”时才会节省空间。如果不是,就没有节省空间的效果。
  2. 这可能是14 * 4字节。这只是一个非常小的内存数量,不必担心。
  3. 如果你有一个64位的Android平台,因此具有8字节的引用大小,这就更加荒谬了。
- Stephen C

2
有三种处理事件的方式。请查看以下链接。

http://tseng-blog.nge-web.net/blog/2009/02/14/implementing-listeners-in-your-android-java-application/

请参阅以下内容,了解匿名类和内部类的用法。 匿名类 如果你想让代码仅在此处使用(这个类仅在这里使用而不在其他地方使用),请使用匿名内部类。 内部类 内部类的代码可以被使用(如果该类被声明为私有,则只能被创建它的类使用)。如果你看到一个命名的内部类,那么可能会认为它会在类的多个位置上被使用。

假设我有10个按钮,如果我为每个侦听器创建10个匿名类,则会创建10个新对象,因此是108字节,但如果我选择使用命名内部类并检查所有10个按钮以查看哪个被点击,我可以节省98字节。你对此有何看法? - AAnkit
@Ankit 在这种情况下,为什么不使用implements关键字呢?你对此有何看法? - Sunil Kumar Sahoo

1

我通常更喜欢一种更微妙的方法,这使得在使用onClick监听器时代码更易于阅读

几乎所有小部件的属性菜单中都有一个名为onClick的属性(也可在布局xml中找到),您可以在其中编写一个方法名称,例如xyz

现在转到您的Java源文件,您只需编写一个方法Ex即可

public void xyz(View v)
{
//your code goes here
}

然后你就完成了。如果你真的想使用内部类,那么如果内存是你关心的问题,就选择匿名内部类(如果它是引用类型,则每个存储的引用占用8字节的内存)。

希望这可以帮到你...如果需要更多解释,请随时提问。


假设我有10个按钮,如果我为每个监听器创建10个匿名类,则会创建10个新对象,因此为 10 * 8 个字节, 但如果我使用命名内部类,并检查所有10个按钮以查看哪个被点击,则可以节省 9 * 8 个字节。关于这个问题你怎么看? - AAnkit
没错,将引用存储在另一个变量中是真的,因为毕竟您要存储对象的引用,而这些引用必须存储在某个地方。但是对于对象(10 * 8是错误的假设),您无法确定它将占用多少内存,因为它可能再次包含自己内部的其他引用以及原始类型。一个对象也可以包含其他对象。 - Nav

1

如果所有按钮具有相似的功能,只有可识别的参数不同,最好创建一个监听器并将其分配给所有按钮。

监听器的位置取决于它需要使用的变量范围。如果它需要使用一些方法变量,则应在方法内部创建;如果它使用类成员,则应在类内部创建。

例如,如果您有十个按钮,每个按钮都应启动不同的活动,则可以创建一个视图和活动的映射,并在监听器中找到适当的活动以启动:

Map<View, Class<?>> viewActivityMap = new HashMap<View, Class<?>>();
// fill it somewhere

// in onCreate
View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Class<?> classToStart = viewActivityMap.get(v);
        Intent intent = new Intent(YourActivity.this, classToStart);
        startActivity(intent);
    }
}

button1.setOnClickListener(listener);
button2.setOnClickListener(listener);
button3.setOnClickListener(listener);

对于监听器而言,我唯一看到需要创建内部类的真正原因是,如果您想创建一个接收与实现类/接口构造函数不同的参数的构造函数。


我需要在点击按钮时调用一些方法,我正在考虑创建一个内部命名类来实现ClickListener,并使用if else条件语句来检查哪个按钮被点击了。或者我应该为每个按钮创建内部匿名类来创建监听器? - AAnkit
如果功能不同,我会创建单独的监听器并分别实现它们,如果功能有些相似,我会使用同一个监听器。 - MByD
谢谢您,我可以看到在Android源代码中,他们也为不同的按钮创建了不同的监听器。 - AAnkit

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