你的位置:首页 > 操作系统

[操作系统]Android自学历程—回调函数的意思(源码+例子)


  为什么会学习回调函数,那还要从线程说起。虽然以前写过一篇文章叫做“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

它的评论我截了几张图片,还是有不错的启发的。

 

 

当然我在知乎也找到了神级别的回答,共享之。

 

好了,大概的了解后,我们可以继续后续的学习了。