Java回调机制详解:
回调方法:
- 程序员A写了一段程序(a1),其中预留了一个回调函数的接口,并且封装好了这个接口。程序员B要让a1调用自己的程序b1中的某个方法,于是他通过a1中的接口回调自己b1中的方法。达到目的
- WTF,你到底在说什么?????
概念看不懂?不够生动?好的,我们来掰扯掰扯:
- 煮一个比较实际的栗子:
- 人养了一只宠物狗,有一天,人被女神放鸽子了,人很生气,调用了自己的方法,揍了一顿他的狗。他的狗被揍了,也很生气,于是反咬了人一口,人感觉非常疼啊,于是他喊了一声。
- 在上面的栗子中,我们能够看到回调的模型。
首先:
- 人揍了狗,狗反咬人,人感觉疼就喊了。这就是一个回调。
- 疑问:
- 怎么能够触发狗一咬人,人就喊疼呢?
- 这就需要回调的知识了
- 让我们来画个图:
- 代码实例:
- 首先需要一个回调接口:
//回调接口,定义人被咬了以后的行为的接口,接口中的方法描述人被咬了以后的行为
public interface CallBack {
public void callBack();
}
- 其次我们需要一条狗:
public class Dog {
//实际上,所谓回调,不是真的让Dog去通知人喊疼。这是不合逻辑的
//所以应该是Dog内部有一个回调接口的对象,这个对象去通知人喊疼。
//而这个对象,是通过Dog进行赋值的,它的来源就是Person,因为Person实现了这个回调接口
CallBack mCallBack;
public void setCallBack(CallBack callBack) {
mCallBack = callBack;
}
public void bitePerson() {
System.out.println("狗反咬一口");
mCallBack.callBack();
}
}
- 现在还需要有一个人
//人实现回调接口,就可以定义被咬以后的行为了
public class Person implements CallBack {
//同时需要在人内部封装一个狗对象
Dog mDog;
public Person(Dog dog) {
mDog = dog;
//给狗内部的回调接口对象赋值
mDog.setCallBack(this);
}
//人揍狗的方法
public void hitDog(){
System.out.println("人不高兴,揍了狗");
mDog.bitePerson();
}
//定义人被咬了以后的行为的方法,也即是回调方法
@Override
public void callBack() {
System.out.println("人被狗咬了 好疼啊");
}
}
- Main方法实现整个回调过程:
public class CallMain {
public static void main(String[] args) {
Person person = new Person(new Dog());
person.hitDog();
}
}
其次
有了上述的栗子,想必大家对回调应该已经没有这么陌生了,接下来,我们再煮一个栗子,吃饱一点。
模拟Android Onclick点击事件
代码实例:
模拟Activity:
public class Activity implements OnClickListener {
Button mButton;
/**
* 模拟Android的Activity中的onCreate()方法
*/
public Activity(Button button) {
//模拟findViewById()
mButton = button;
mButton.setOnClickListener(this);
}
@Override
public void onClick() {
System.out.println("按钮被点击了");
}
/**
* 模拟Button点击
*/
public void push() {
mButton.performClick();
}
}
- 模拟Button:
public class Button {
OnClickListener mOnClickListener;
public void setOnClickListener(OnClickListener onClickListener) {
mOnClickListener = onClickListener;
}
public void performClick() {
//这就是回调
mOnClickListener.onClick();
}
}
- 模拟点击事件的回调
public interface OnClickListener {
public void onClick();
}
- 模拟点击过程的main方法
public class ClickMain {
public static void main(String[] args) {
Activity activity=new Activity(new Button());
activity.push();
}
}