为什么会学习回调函数,那还要从线程说起。虽然以前写过一篇文章叫做“Android自学历程—多线程”,现在看看还是太年轻了。
在学习线程的时候,我试着看了看Handler的源码,于是对其中的Callback接口产生了兴趣。于是补自身不足,拿来学习学习。废话到此为止,整理思路,一起来学习。
下面这是一段Handler的源码
/** * Callback(回收) interface(界面) you can use when instantiating(例示) a Handler to avoid * having to implement(实施) your own subclass(亚纲) of Handler. * * @param msg A {@link android.os.Message Message} object * @return True if no further handling is desired */ public interface Callback { public boolean handleMessage(Message msg); } /** * Subclasses(亚纲) must implement(实施) this to receive messages. */ public void handleMessage(Message msg) { }
上面的中文翻译不是我翻译的,翻译软件干的好事,没一个对的。。。
Handler相信大家都用过,当我们实例化一个Handler时,大家都说我们要实现其中的方法,其实就是实现HandleMessage的方法。
我们再来看看源码,对此的实现方式。首先是Callback方法的接口,既然是接口,那我们就必须实现其中所有的方法,既“handleMessage”方法。
大家再看看上面我用红色标注的英文,是不是有了感觉,别急。我们再来找个例子看看。
下面是一段OnClickListener的源码
/** * Interface definition for a callback to be invoked when a view is clicked. */ public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); }
我们来看一下红色标注的这段话:当一个View被点击时,这个接口定义的回调函数将会被触发。我们并不会显示的调用OnClick方法,用户触发了这个点击事件,系统会去调用这个OnClick方法。
我有顺路把setOnClickListener的源码找了过来,可能对后面有助于理解
/** * Register a callback to be invoked when this view is clicked. If this view is not * clickable, it becomes clickable. * * @param l The callback that will run * * @see #setClickable(boolean) */ public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; }
这里,我找到一个不错的教程,能让我们更好的理解:用代码,模拟注册事件监听器
先写一个监听器接口
package com.listener; /** * 点击监听器接口 */ public interface MyOnClickListener { public void onClick(); }
写一个我们自己的Button类,实现点击效果。
package com.listener; ` public class MyButton { private MyOnClickListener listener; /** * 设置具体点击监听器 * @param listener 点击监听器实现类 */ public void setOnClickListener(MyOnClickListener listener) { this.listener = listener; } /** * 按钮被点击 */ public void doClick() { listener.onClick(); } }
最后模拟Client端的注册监听器和触发点击操作。
package com.listener; publicclass Client { public static void main(String[] args) { MyButton button =new MyButton(); //注册监听器 button.setOnClickListener(new MyOnClickListener() { @Override public void onClick() { System.out.println("按钮被点击了"); } }); //模拟用户点击 button.doClick(); } }
这个我看了有一会,感受一下还是有感觉的。http://blog.csdn.net/jason0539/article/details/10168899
它的评论我截了几张图片,还是有不错的启发的。
当然我在知乎也找到了神级别的回答,共享之。
好了,大概的了解后,我们可以继续后续的学习了。
时间: 2024-10-10 13:03:39