引言
所谓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的经典用法之一。