为什么回调方法需要返回一些东西?

时间:2015-06-19 14:07:47

标签: java interface callback return-value

我以前从未见过这样的事情,所以让我说我有这样的倾听对象:

MyWhateverListener dafuqListener = new MyWhateverListener() {

  @Override
  public void onSuccessCall(String s) {
    // success call
  }

  @Override
  public void onFailCall(boolean b) {
    // fail call
  }

  @Override
  public boolean onDafuqCall(int i, boolean b) {
      // some whatever code
      return false;
  }
};

一切正常,当一些动作成功时,将会回调适当的方法,但return onDafuqCall方法内部有什么问题,为什么需要它,它会返回什么东西?

P.S。此界面来自Android广告提供商的SDK。

3 个答案:

答案 0 :(得分:3)

目前还不清楚你的要求,但我会试一试。

接口是一种允许对象遵循特定模式的方法。例如,当我有一个名为“ Listener ”的界面和五个实现时,它们会派上用场: ActionListener,MouseListener,KeyListener,CloseListener,StateChangeListener 如果我想要一个允许用户注册用户的方法,而不是为每个实现创建单独的“ registerListener ”方法,我可以:registerListener(Listener l)

现在回到你的帖子,Interfaces可能包含带有返回值的方法,作为一个例子,如果我有一个名为Event的接口,它包含一个名为isCanceled()的方法,它返回boolean,然后如果我有一个实现调用“ClickEvent”,我想检查这个事件(在它被调用之后)是否被任何人或任何东西取消我将调用isCanceled()方法并且应该返回一个值,因为它是由实现对象处理的。

因此,为了将其包装起来,调用侦听器获取信息的代码片段需要返回值。如果我们查看Java接口及其实现,我们可以找到大量示例。您可以通过查看java.uti.List接口源和java.util.ArrayList之类的实现来检查自己

可以从文档中获取更多信息:

编辑#1:以下是上面解释的示例,代码如下:

事件界面:

package com.fillpant.examples;

public interface Event {

    public boolean isCanceled();
    public void setCanceled(boolean value);

}

ClickEvent(实现事件):

package com.fillpant.examples;

public class ClickEvent implements Event {

    private boolean canceled = false;

    @Override
    public boolean isCanceled() {
        return canceled;
    }

    @Override
    public void setCanceled(boolean value) {
        canceled = value;
    }

}

调用ClickEvent的位置。这里我演示了为什么需要返回值(参见isCanceled()方法):

package com.fillpant.examples;

public class EventCaller {
//This class calls an event, and all the listeners will have to handle it;

    public void callClickEvent(){
        Event e = new ClickEvent();
        for(Listener l : all_registered_listeners){//this is hypothetical, if we had listeners.
            l.event(e);
        }
        if(e.isCanceled()) return;
        else{
            //DoStuff
        }
    }

}

如果您有任何疑问,请不要犹豫:D

答案 1 :(得分:3)

这是非常正常的事情。侦听器/观察者接口与主题/事件抛出类配对。通常,您希望您的听众与主题的行为完全脱节,以至于主体既不知道也不关心注册了多少听众。这是纯粹的'图案。这是最常见的,所有方法都是无效的,因为它们只被主体调用,主体行为不依赖于它的听众。

然而,有时听众有其他方法不打算被主题调用,并且听众可以充当主题状态和程序其他部分之间的桥梁。一个常见的例子是为调试制作特殊的监听器。在这里你创建一个新的监听器,它扩展了你以前的监听器,但它也跟踪一个主题调用它的确切时间,然后它有一个带有返回值的方法,以便你的测试代码可以访问这个状态,并确切地看到它是什么听众正在做。

最后,让听众影响主体的行为偶尔会有意义。在这种情况下,返回方法是必要的。但这种情况很少见,并且没有危险,有时会使用,例如确保以正确的顺序删除链中的内容。因此,如果您未能删除子项,则会停止删除链。它有一个名字,但我不记得现在这个模式到底是什么。

答案 2 :(得分:2)

这是我对该主题的理解: 通常,监听/回叫方法不需要返回任何内容,并且响应事件而调用它们。 例如onClick()的{​​{1}}方法。

OnClickListener

但是如果它们是事件链的一部分,那么布尔返回类型用于中止继续执行事件。例如来自OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { //some click handling code } }; 的{​​{1}}方法。

onDrag()

此方法的文档说"如果成功处理了拖动事件,则返回true;如果未处理拖动事件,则返回false。请注意,false将触发OnDragListener调用其OnDragListener onDragListener = new OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { //some drag handling code return false; } } 处理程序。" 因此,如果它们是事件链的一部分,则在回调/事件处理方法中返回并不是很常见。应该返回的内容是API文档的一部分。