【问题标题】:Callback codes execution回调代码执行
【发布时间】:2021-04-18 07:01:48
【问题描述】:

我试图理解 Java 中的回调,但这让我很困惑。我知道回调是通过实现接口作为对象传递的。但我无法理解如何调用参数中传递的那些对象的函数。 我举了这个例子

interface ClickEventHandler {
    public void handleClick();
}
//Step 2: Create a callback handler
//implementing the above interface
class ClickHandler implements ClickEventHandler {
    public void handleClick() {
      System.out.println("Clicked");
    }
}

//Step 3: Create event generator class
class Button {
    public void onClick(ClickEventHandler clickHandler) {
      clickHandler.handleClick();
    }
}

public class Tester {
    public static void main(String[] args) {
        Button button = new Button();
        ClickHandler clickHandler = new ClickHandler();
        //pass the clickHandler to do the default operation
        button.onClick(clickHandler);

        Button button1 = new Button();
        //pass the interface to implement own operation
        button1.onClick(new ClickEventHandler() {
            @Override
            public void handleClick() {
                System.out.println("Button Clicked");
            }
        });
    }
}

Output is 
```none
Clicked Button
Clicked.

我的意思是调用传递对象的函数,我们需要注册它并调用函数。如果是听众,它是如何工作的?如果有人指导我理解这一点会很有帮助。

【问题讨论】:

  • 您在分配点击处理程序时正在调用handleClick!执行单击时应调用 handleClick!
  • 关键是interface的使用。这描述了可能由被观察对象执行的预期功能。因此,传递实现ClickEventHandler 的对象的实例意味着该对象可以调用handleClick,因为它保证了实现(干草多态!)
  • @JaysmitoMukherjee 感谢分享示例。对我有很大帮助。
  • @MadProgrammer 如果我错了,请纠正。一般来说,如果我们必须在类中使用一些回调函数,那么类中应该有一些函数会调用回调函数。因此,我们需要创建一个带有回调函数名称的接口并实现它,然后我们应该将它传递给类的对象方法来注册它,然后我们调用调用回调代码的对象函数。

标签: java callback


【解决方案1】:

好吧,您通常会维护对ClickEventHandler 的引用(如果您想支持多个,甚至可以维护一个列表)并在单击按钮时调用该方法。

例子:

class Button {
  private ClickEventHandler clickHandler;

  public void onClick(ClickEventHandler clickHandler) {
    this.clickHandler = clickHandler;
  }

  public void click() {
     if( clickHandler != null ) {
       clickHandler.handleClick();
     }
  }

现在,当您调用 onClick() 时,侦听器仅被注册,并且仅在单击按钮时才会执行(即您调用 click() 方法)。

【讨论】:

    【解决方案2】:

    很简单,你只需要创建interface

    interface HandleClick {
        void onItemClick(Boolean success);
    }
    

    有一些函数可以做一些工作,你需要一些东西来返回

    public static void someFunctions(String params, HandleClick handleClick) {
        //some work to do here.
        handleClick.onItemClick(true);
    }
    

    你可以在任何地方调用它

    class Main extends AppCompatActivity  {
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
            super.onCreate(savedInstanceState, persistentState);
    
            Callbacks.someFunctions("param", new HandleClick() {
                @Override
                public void onItemClick(Boolean success) {
    
                }
            });
        }
    
    }
    

    【讨论】:

    • 添加特定于 Android 的代码可能会使 OP 更加困惑。问题中没有任何内容表明他们使用的是 Android,而且回调不仅仅适用于 Android。
    【解决方案3】:

    我编写了一个简单的代码来了解我们如何以两种不同的方式执行相同的回调。

    interface InterestingEvent
    {
    
    public void interestingEvent ();
    }
    
    
    public class Test
    {
        private InterestingEvent ie;
        public void EventNotifier (InterestingEvent event)
        {
        ie = event;    
        ie.interestingEvent();
        } 
       
        public static void main(String[] args) {
            
            Test test= new Test();
            test.EventNotifier(new InterestingEvent() {
                
                @Override
                public void interestingEvent() {
                    System.out.println("I am callback code");
                    
                }
            });
            
        }
    }
    
    public class Test implements InterestingEvent{
    
    @Override
    public void interestingEvent() {
        System.out.println("Hello i am callback code");
        
    }
    
    public void EventNotifier ()
    {
        this.interestingEvent();
    } 
    
    public static void main(String[] args) {
        
        Test test =new Test();
        test.EventNotifier();
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2019-03-05
      相关资源
      最近更新 更多