美文网首页
通过Android源码理解回调函数

通过Android源码理解回调函数

作者: zhangxiao | 来源:发表于2017-03-16 20:41 被阅读0次

概述

我们先看一下维基百科对回调函数的定义:

计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码引用。这一设计允许了底层代码调用在高层定义的子程序

举个栗子

我们看一下android中最经典的View.setOnClickListener()源码:

1.定义接口<View类中>

    /**
     * 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);
    }

2.注册回调函数<View类中>

    /**
     * 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(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }

3.执行回调函数<View类中>

/**
     * Call this view's OnClickListener, if it is defined.  Performs all normal
     * actions associated with clicking: reporting accessibility event, playing
     * a sound, etc.
     *
     * @return True there was an assigned OnClickListener that was called, false
     *         otherwise is returned.
     */
    public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }

        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
        return result;
    }

4.调用View的注册回调函数方法<MainActivity中>

view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do something
            }
        });    

ok了,这样就完成了一次完整的回调函数.

总结一下

首先,在MainActivity中通过View中的setOnclickListener方法的参数将OnClickListener 接口的实现者传给了View,最终在被点击时在performClick方法中,执行了实现者的onClick方法.
是不是就如维基百科上的回调定义:通过函数参数传递到其它代码的,某一块可执行代码的引用.O(∩_∩)O.

相关文章

网友评论

      本文标题:通过Android源码理解回调函数

      本文链接:https://www.haomeiwen.com/subject/izfjnttx.html