Java回调机制

引言

所谓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这一方法:

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent 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的经典用法之一。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值