在编程中使用回调来实现代码的自动调用是非常常见的。而对于编程新手来说如何实现回调是一件看起来比较困难的事,但实际上回调的实现是非常简单的。
首先我们要理解回调的概念,下面我们引用一下wiki上的定义
在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
但是在Java语言中并没有函数类型的参数,wiki也给出了说明
在缺少函数类型的参数的面向对象的程序语言中,例如Java,回调可以用传递抽象类或接口来模拟。回调的接收者会调用抽象类或接口的方法,这些方法由调用者提供实现。这样的对象通常是一些回调函数的集合,同时可能包含它所需要的数据。这种方法在实现某些设计模式时比较有用,例如访问者模式,观察者模式与策略模式。
下面我就以为文件下载为例写一个文件下载完成后的回调函数。
首先我们要写一个接口这个接口内我们写一个完成下载的回调方法
interface DownLoadListener{ onDownLoadComplete(); }
而后我们在文件下载模块中写一个设置监听器的方法将别人实现的DownLoadListener设置给DownLoadFiles中持有的DownLoadListener对象
Class DownLoadFiles{ //下载模块自己持有的监听对象 DownLoadListener mListener; //该方法将其他人实现的DownLoadListener 对象设置给下载模块自己持有的对象 void setDownLoadListener(DownLoadListener listener){ mListener = listener; } }
现在我们只要在文件下载完成时调用listener的onDownLoadComplete方法就好
Class DownLoadFiles{ //下载模块自己持有的监听对象 DownLoadListener mListener; //该方法将其他人实现的DownLoadListener 对象设置给下载模块自己持有的对象 public void setDownLoadListener(DownLoadListener listener){ mListener = listener; } downLoad(){ ...... if(downLoadfinish){ listener.onDownLoadComplete(); } ...... } }
使用这个回调也非常简单
class MyClass{ Function(){ DownLoadFiles downLoad = new DownLoadFiles(); downLoad.setDownLoadListener( new DownLoadListener(){ onDownLoadComplete(){ //在此处实现你想要回调具体功能 ...... } } ); } }
参考和推荐阅读
https://zh.wikipedia.org/wiki/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0
https://www.zhihu.com/question/19801131