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();
                }
            }

 评论