85

我想了解回调的概念。我在互联网上搜索了有关回调的信息,并且有很多使用接口的示例,并且一个类正在使用该接口调用另一个类的方法。但是还是搞不懂回调的主要概念,使用回调的目的是什么?

4

6 回答 6

180

这是一个很好的教程,它很好地描述了回调和用例。

回调的概念是在另一个类中的某些工作完成时通知一个类同步/异步。有人称之为好莱坞原则:“不要叫我们我们叫你”。

这是一个例子:

class A implements ICallback {
     MyObject o;
     B b = new B(this, someParameter);

     @Override
     public void callback(MyObject o){
           this.o = o;
     }
}

class B {
     ICallback ic;
     B(ICallback ic, someParameter){
         this.ic = ic;
     }

    new Thread(new Runnable(){
         public void run(){
             // some calculation
             ic.callback(myObject)
         }
    }).start(); 
}

interface ICallback{
    public void callback(MyObject o);
}

A 类调用 B 类在线程中完成一些工作。如果线程完成工作,它将通过回调通知 A 类并提供结果。所以不需要轮询什么的。一旦结果可用,您就会得到结果。

在 Android 中,回调用于活动和片段之间。因为 Fragment 应该是模块化的,所以你可以在 Fragment 中定义一个回调来调用 Activity 中的方法。

于 2013-08-05T09:34:33.500 回答
49

您首先创建一个接口,然后定义一个方法,该方法将充当回调。在此示例中,我们将有两个类,一个是classA,另一个是 classB

界面:

public interface OnCustomEventListener{
  public void onEvent();   //method, which can have parameters
}

classB 中的监听器本身(我们只在 classB 中设置监听器)

private OnCustomEventListener mListener; //listener field

//setting the listener
public void setCustomEventListener(OnCustomEventListener eventListener) {
   this.mListener=eventListener;
}

在 A 类中,我们如何开始倾听 B 类必须告诉的任何内容

classB.setCustomEventListener(new OnCustomEventListener(){
    public void onEvent(){
       //do whatever you want to do when the event is performed.
    }
});  

我们如何从 classB 触发事件(例如在按下按钮时)

if(this.mListener!=null){
   this.mListener.onEvent();
}

PS您的自定义侦听器可能具有您想要的任意数量的参数

来源

于 2013-08-05T09:30:00.037 回答
9

回调在 Java 中非常有用。

使用回调,您可以通知另一个类已成功或错误完成的异步操作。

于 2013-08-05T09:30:08.840 回答
4

CallBack Interface用于在android中Fragment进行通信。Fragment

请参阅此处以了解您的理解。

于 2013-08-05T09:51:10.207 回答
3

之前在这里讨论过。

在计算机编程中,回调是一段可执行代码,它作为参数传递给其他代码,期望在某个方便的时间回调(执行)该参数。调用可能是即时的,如在同步回调中​​,也可能在稍后发生,如在异步回调中。

于 2013-08-05T09:31:01.327 回答
0

我在以下情况下使用:在 UI 中,我从一个按钮获得了一个动作,例如。用户想要下载一个 500mb 的文件。谢谢 我会初始化后台引擎(AsyncTask 类)并传递参数给他。在 UI 上,我将显示一个阻止进度对话框并禁止用户进行任何其他点击。问题是:何时从 UI 中移除阻塞?答案是:当引擎以成功或失败结束时,可以是回调或通知。

通知和回调有什么区别这是另一个问题,但是 1:1 的回调更快。

于 2013-08-05T09:34:12.090 回答