Java回调机制

来源:互联网 发布:wpsoffice软件怎么用 编辑:程序博客网 时间:2024/05/08 06:41

引言

所谓java回调,一言以蔽之:对目标对象的“逆”引用。

同步回调

最经典的同步回调方法当属android中View类的onClick方法。

android在View的内部类中声明了点击事件的回调接口OnClickListenner:

    /**     * 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的某个子类如Button,ImageView,TextView等,当需要监听这个控件的点击事件,就需要在Activity中实现OnClickListener接口,并在代码中实现OnClick这一方法:

@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = null;switch (v.getId()) {case R.id.btnId1:intent = new Intent(MainActivity.this, DataTimePicker.class);startActivity(intent);break;case R.id.btnId2:intent = new Intent(MainActivity.this, AnalogDigitalClock.class);startActivity(intent);break;}}

我们现在看下View中OnClickListener的处理:

public class View implements Drawable.Callback, KeyEvent.Callback,        AccessibilityEventSource {    /**      * Listener used to dispatch click events.      * This field should be made private, so it is hidden from the SDK.      * {@hide}      */    public OnClickListener mOnClickListener;    /**     * 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;    }    /**     * 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;    }}
当View发了生点击事件,View(Button,ImageView等)的performClick方法被调用,方法中OnClickListener实例对象回调MyActivity实现的onClick方法,实现对点击事件的处理:

btnId1.setOnClickListener(this);btnId2.setOnClickListener(this);

对目标对象的“逆”引用是回调的实现的关键,这其实也是Interface的经典用法之一。





原创粉丝点击