Android的回调模拟
想要彻底理解安卓中用的回调,最好的办法是自己写一个类似的实现安卓中回调功能的实现方法。
我自己写了一个可以实现setOnClickListener回调的工程:
具体目录:
工程源码的具体地址:http://pan.baidu.com/s/1c0hWPkk ,
View.java:模拟的是Android中的View控件,
1 package com.wyl.ximahui; 2 3 public class View { 4 public OnClickListener listener; 5 public String type; 6 7 /** 8 * 两个参数的构造器 9 * 10 * @param listener 11 * @param type 12 */ 13 public View(OnClickListener listener, String type) { 14 super(); 15 // this.listener = listener; 16 this.type = type; 17 } 18 19 public View(String type) { 20 super(); 21 this.type = type; 22 } 23 24 /** 25 * 一个参数的构造器 26 * 27 * @param listener 28 * 传入的对象为一个接口, 29 */ 30 public View(OnClickListener listener) { 31 super(); 32 this.listener = listener; 33 } 34 35 public OnClickListener getListener() { 36 return listener; 37 } 38 39 /** 40 * 这个方法尤其重要,这个set方法的重要性在于给View对象的成员变量传入接口实例对象, 41 * 如果不传入的话那么在点击View控件的时候就无法调用接口对象的OnClick()方法, 42 * @param listener 43 */ 44 public void setListener(OnClickListener listener) { 45 // 左侧:View对象的成员变量,右侧:一个OnClickListener接口类型的变量,在真正的方法调用中,就是一个OnClickListener接口类型的对象 46 this.listener = listener; 47 } 48 49 public String getType() { 50 return type; 51 } 52 53 public void setType(String type) { 54 this.type = type; 55 } 56 57 /** 58 * Click()方法模拟button的点击事件,一点击就会触发接口的OnClick()方法 59 */ 60 public void Click() { 61 if (listener != null) { 62 /* 63 * 只有View对象(控件对象,比如button等)的成员变量listener不为空的时候 64 * 回调listener接口对象的OnClick方法,这个方法的入参恰恰是View类型的变量 65 */ 66 listener.Onclick(this); 67 } else { 68 // 如果View对象(控件对象,比如button等)的成员变量listener为空(即不给View传入接口对象),那么捕获,否则会报错 69 System.out.println("要先注册listener...."); 70 return; 71 } 72 } 73 }
OnClickListener.java,是一个接口,
1 package com.wyl.IntP; 2 3 import com.wyl.component.View; 4 /** 5 * 模拟Android中的OnClickListener接口, 6 * 这个接口中只有一个OnClick()方法, 7 * @author Administrator 8 * 9 */ 10 public interface OnClickListener { 11 public void Onclick(View view); 12 }
测试类:
1 package com.wyl.test; 2 3 import com.wyl.IntP.OnClickListener; 4 import com.wyl.component.View; 5 6 public class TestClick { 7 public static void main(String[] args) { 8 View v1 = new View("ListView"); 9 v1.setListener(new OnClickListener() { 10 11 @Override 12 public void Onclick(View view) { 13 // TODO Auto-generated method stub 14 System.out.println("v1控件的类型是:" + view.getType()); 15 } 16 }); 17 v1.Click();//Click()相当于Android中点击一个button的时候触发的事件,模拟点击事件 18 } 19 }
运行结果:
v1控件的类型是:ListView