当我阅读注册听众的示例Android代码时,有时我会看到:
someService.registerListener(this);
在这种情况下,当前类声明为implements SomeListener
并覆盖SomeListener
接口中声明的一个或多个方法,即在当前类的后面,它们将声明:
@Override
public void someInterfaceMethod() {
...
}
其他时候我看到:
someService.registerListener(new SomeListener() {
@Override
public void someInterfaceMethod() {
...
});
是否有理由偏好另一种方法?
答案 0 :(得分:1)
没有首选方法可以从这两个选项中进行选择,该方法只需要一个符合接口契约的类(实现它的所有方法)。
当我尝试不要有太多的匿名课程时,我会使用this
,但是将它们全部组合起来
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
doSomething;
break;
case R.id.btn2:
doSomethingElse();
break;
}
}
通过在函数外部定义一些变量并将其分配给我的所有方法,我也可以在不使用外部类的情况下使用相同的功能。
private View.OnClickLisetner myClickListener = new View.OnClickListsner() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
doSomething;
break;
case R.id.btn2:
doSomethingElse();
break;
}
}
}
答案 1 :(得分:0)
您自己的类正在实现该接口,因此编译器将在您的类合同中找到重写的方法,您将其称为将修改这些方法的行为的类。
答案 2 :(得分:0)
正如前面提到的@Ahmed,这是很好的解释,但我会更深入。
当您为某些侦听器实现接口时,编译器只会将该类注册为该类事件的侦听器。但是当你直接传递像
这样的界面时btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
或者像这样
private View.OnClickLisetner myClickListener = new View.OnClickListsner() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
doSomething;
break;
case R.id.btn2:
doSomethingElse();
break;
}
}
}
编译器将为您创建匿名类,然后将该子类注册为事件的事件侦听器。 More about it
现在使用 由您决定如何实现它。在我看来,当你想要这个事件(任何事件,如点击或触摸)超过2次时,你应该实现接口和重载方法,这样它就不会在运行时创建太多的内部(匿名)类。