回调(Callback)是指A调用B的某个方法,B完成这个方法后通知A,这个机制在Java中被广泛应用,比如事件驱动(Event-Driven)编程、异步编程等。
下面分别通过两个实际例子来阐述Java中的回调机制:
例子一:事件驱动编程
在GUI(Graphical User Interface)编程中,事件驱动模型非常常见,我们可以通过按钮、文本框等控件来响应用户的操作,触发我们为控件设置的回调函数。
举例来说,当一个按钮被点击时,我们可以通过以下方式为按钮设置回调函数:
// Button类的定义
public class Button {
// 回调接口定义
public interface OnClickListener {
void onClick(Button button);
}
// 持有OnClickListener类型的引用
private OnClickListener onClickListener;
// 注册一个OnClickListener类型的回调函数
public void setOnClickListener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
// 当用户点击按钮时,触发onClick方法,通知注册的回调函数
public void onClick() {
if (onClickListener != null) {
onClickListener.onClick(this);
}
}
}
我们可以在GUI程序中利用上述Button类设置回调函数,示例代码如下:
Button button = new Button();
button.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(Button button) {
System.out.println("Button is clicked.");
}
});
// 用户点击按钮后会输出"Button is clicked."
button.onClick();
例子二:异步编程
在多线程编程中,我们通常需要执行一些耗时的任务,为避免阻塞UI线程或占用系统资源,我们需要进行异步编程。比如当用户在UI界面中点击下载按钮,我们需要启动一个新线程下载文件,当下载完成后我们通知UI线程执行一个回调接口。
我们可以通过Java中的Callable和Future接口来实现异步编程。
示例代码如下:
public class DownloadTask implements Callable<String> {
private final String url;
private final DownloadListener listener;
public DownloadTask(String url, DownloadListener listener) {
this.url = url;
this.listener = listener;
}
@Override
public String call() {
// 此处省略文件下载的具体实现
// ...
// 下载完成后,调用回调接口通知UI线程
listener.onDownloadComplete(file.getAbsolutePath());
return file.getAbsolutePath();
}
}
interface DownloadListener {
void onDownloadComplete(String filePath);
}
// 当用户点击“下载”按钮时,启动一个新线程下载文件
public void downloadButtonClicked() {
new Thread(new DownloadTask(url, new DownloadListener() {
@Override
public void onDownloadComplete(String filePath) {
// 下载完成后,更新UI界面
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
updateUI(filePath);
}
});
}
})).start();
}
在异步编程模式中,我们通过把回调函数传递给异步任务,在任务完成时通知调用者。同时为了避免跨线程访问UI组件引起线程安全问题,我们需要使用SwingUtilities.invokeLater方法来在UI线程中执行回调函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:两个例子了解java中的回调机制 - Python技术站