为什么听众有时会注册到"这个"有时到匿名课?

时间:2016-05-21 14:58:42

标签: java android interface

当我阅读注册听众的示例Android代码时,有时我会看到:

someService.registerListener(this);

在这种情况下,当前类声明为implements SomeListener并覆盖SomeListener接口中声明的一个或多个方法,即在当前类的后面,它们将声明:

@Override
public void someInterfaceMethod() {
    ...
}

其他时候我看到:

someService.registerListener(new SomeListener() {
    @Override
    public void someInterfaceMethod() {
        ...
    });

是否有理由偏好另一种方法?

3 个答案:

答案 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次时,你应该实现接口和重载方法,这样它就不会在运行时创建太多的内部(匿名)类。