在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序。
在JAVA里面我们使用接口的方式来实现函数的回调。
回调的通俗就是:程序员阿祥写了一段程序(CallPerson)其中有回调函数的接口(PhoneCall),并且封装好了程序(CallPerson)。程序员阿呆写了程序(MumCall)要让
阿祥写的程序(CallPerson)调用阿呆写的程序(MumCall)中的方法。于是阿祥的程序(CallPerson)通过程序中(CallPerson)的接口(PhoneCall)调用阿呆的程序(MumCall)的方法。
列子如下:
/** * 阿祥的程序CallPerson * @author joker.chan * */ public class CallPerson { private PhoneCall phoneCall; public CallPerson(PhoneCall phoneCall) { // TODO Auto-generated constructor stub this.phoneCall = phoneCall; } public void phoneCall() { phoneCall.phonecall(); } }
/** * 回调函数电话接口 * @author joker.chan * */ public interface PhoneCall { public void phonecall(); }
/** * 阿呆的程序MumCall * @author joker.chan * */ public class MumCall implements PhoneCall { @Override public void phonecall() { // TODO Auto-generated method stub System.out.println("妈妈打电话叫你回家吃饭了!!!"); } }
调用方法:
public static void main(String[] args) { // TODO Auto-generated method stub MumCall mc = new MumCall(); CallPerson cp = new CallPerson(mc); cp.phoneCall(); }
运行结果:
妈妈打电话叫你回家吃饭了!!!
Android中回调函数的基本使用。
1.按钮的监听
Button button = (Button)this.findViewById(R.id.button); button.setOnClickListener(newButton.OnClickListener() { //回调函数 @override publicvoidonClick(View v) { buttonTextView.setText("按钮被点击了"); } });
上面的代码给按钮加了一个事件监听器,这其实就是“回调”最常见的应用场景之一。我们自己不会显式地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。
2.生命周期函数
@Override publicvoidonCreate(BundlesaveInstanceState) { super.onCreate(saveInstanceState); // You code... } @Override publicvoidonResume() { super.onResume(); // You code... }
Activity的整个生命周期基本上都说回调函数在发挥作用。
优点:优点主要是将代码中变与不变的部分相分离,从而大大提高了程序的重用性和扩展性。
Android事件侦听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的侦听器被用户界面操作触发时由Android框架调用。回调方法被包含在Android事件侦听器接口中:
例如,Android 的view 对象都含有一个命名为 OnClickListener 接口成员变量,用户的点击操作都会交给 OnClickListener的 OnClick() 方法进行处理。
开发者若需要对点击事件做处理,可以定义一个 OnClickListener 接口对象,赋给需要被点击的 view的接口成员变量OnClickListener,一般是用 view 的setOnClickListener() 函数来完成这一操作。
当有用户点击事件时,系统就会回调被点击view的OnClickListener接口成员的OnClick()方法。
实例(对于Android界面上Button点击事件监听的模拟):
1.定义接口 public interface OnClickListener { public void OnClick(Button b); }
2. 定义Button public class Button { OnClickListener listener; public void click() { listener.OnClick(this); } public void setOnClickListener(OnClickListener listener) { this.listener = listener; } }
3. 将接口对象OnClickListener 赋给 Button的接口成员 public class Activity { public Activity() { } public static void main(String[] args) { Button button = new Button(); button.setOnClickListener(new OnClickListener(){ @Override public void OnClick(Button b) { System.out.println("clicked"); } }); button.click(); //user click,System call button.click(); }