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

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

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

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

时间: 2024-10-10 13:03:39

Android自学历程—回调函数的意思(源码+例子)的相关文章

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

Android异步消息处理机制详解及源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 最近相对来说比较闲,加上养病,所以没事干就撸些自己之前的知识点为博客,方便自己也方便别人. 1 背景 之所以选择这个知识点来分析有以下几个原因: 逛GitHub时发现关注的isuss中有人不停的在讨论Android中的Looper , Handler , Me

android四大组件之Activity - (1)从源码中理解并巧用onWindowFocusChanged(boolean hasFocus)

这里开始到后面,想趁着有时间,将Android四大组件和一些系统组件做一些总结和记录.由于网上已经有很多写的很好并且总结也全面的文章.小弟我也囊中羞涩不敢献丑,就记录一些自己觉得重要的有用的知识点,顺便大家一起学习讨论啥的也好 Activity作为四大组件之一,对于整个Android开发有多重要就无需赘言了.关于它的生命周期,这里借用下官网的图,便一目了然: 那么它的生命周期和我们所说的onWindowFocusChanged(boolean hasFocus)方法有何关系? Activity生

Android斗地主棋牌游戏牌桌实现源码下载

本次给大家分享下Android斗地主棋牌游戏牌桌实现源码下载如下:为了节约内存资源,每张扑克牌都是剪切形成的,当然这也是当前编程的主流方法. 1.主Activity    package com.bison;            import android.app.Activity;      import android.content.pm.ActivityInfo;      import android.os.Bundle;      import android.view.Wind

Android View体系(八)从源码解析View的layout和draw流程

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 Android View体系(七)从源码解析View的measure流程 前言 上一篇文章我们讲了View的measure的流程,接下来我们

Android ListView动画特效实现原理及源码

Android 动画分三种,其中属性动画为我们最常用动画,且能满足项目中开发几乎全部需求,google官方包支持3.0+,我们可以引用三方包nineoldandroids来失陪到低版本.本例子中就是用属性动画实现效果. 对普通的View做动画,我们只要定义好要的动画ObjectAnimator或AnimatorSet,然后设置属性启动及可.但是,对ListView做动画应该如何.什么时候.在什么地方.对哪个View做动画属性呢? github上有成熟的listview动画包 https://gi

Android跟踪球-手势移动图片-自定义控件(附源码)

由于我不会制作动画图片,所以先放几及其不具备代表性的展示图片. 我以前的思路是通过动态的设置xy坐标通过手势移动来识别,但是我后来试了一下,发现运行效果极差.所以偷闲做了下这个跟踪球控件,其实实现十分简单.只要大家熟悉自定义控件的使用以及手势识别.基本上就ok了. 现在我们看下这个控件的源码TouchMoveView.java package com.fay.touchmove; import android.annotation.SuppressLint; import android.con

android 读取,写入图片到sd卡源码

<pre name="code" class="html"><!--<span style="font-family: Arial, Helvetica, sans-serif;">在AndroidMainfest.xml文件中添加</span><span style="font-family: Arial, Helvetica, sans-serif;">-->&l

Android View体系(七)从源码解析View的measure流程

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 前言 在上一篇我们了解了Activity的构成后,开始了解一下View的工作流程,就是measure.layout和draw.measure