【发布时间】:2013-08-05 09:27:05
【问题描述】:
我想了解回调的概念。我在互联网上搜索了回调,并且有很多使用接口的示例,一个类正在使用该接口调用另一个类的方法。但是还是搞不懂回调的主要概念,使用回调的目的是什么?
【问题讨论】:
-
这是在 Java 中实现 lambdas 的一种方式,因为直到 Java 8 才支持它们。
我想了解回调的概念。我在互联网上搜索了回调,并且有很多使用接口的示例,一个类正在使用该接口调用另一个类的方法。但是还是搞不懂回调的主要概念,使用回调的目的是什么?
【问题讨论】:
这是一个很好的tutorial,它很好地描述了回调和用例。
回调的概念是在另一个类中的某些工作完成时通知一个类同步/异步。有人称之为好莱坞原则:“不要叫我们我们叫你”。
这是一个例子:
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 中,回调用于 f.e.在活动和片段之间。因为 Fragment 应该是模块化的,所以你可以在 Fragment 中定义一个回调来调用 Activity 中的方法。
【讨论】:
您首先创建一个接口,然后定义一个方法,该方法将充当回调。在此示例中,我们将有两个类,一个 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();
}
附:您的自定义侦听器可能有任意数量的参数
【讨论】:
回调在 Java 中非常有用。
使用回调,您可以通知另一个类异步操作已成功或错误完成。
【讨论】:
CallBack Interface用于Fragment到Fragment在android中的通信。
请参考here 了解。
【讨论】:
在here 之前讨论过。
在计算机编程中,回调是一段可执行代码,它作为参数传递给其他代码,期望在某个方便的时间回调(执行)该参数。调用可能是即时的,如同步回调中,也可能稍后发生,如异步回调中。
【讨论】:
我在以下情况下使用: 在 UI 中,我从一个按钮获得了一个动作,例如。用户想要下载一个 500mb 的文件。 谢谢 我会初始化后台引擎(AsyncTask 类)并传递参数给他。 在 UI 上,我将显示一个阻止进度对话框并禁止用户进行任何其他点击。问题是:何时从 UI 中移除阻塞?答案是:当引擎以成功或失败结束时,可以是回调或通知。
通知和回调有什么区别这是另一个问题,但是 1:1 的回调更快。
【讨论】: