为了方便理解就用最简单的同步回调:事件监听来理解
首先说一下同步的周期:
我们继承的listener就是一个回调的接口,首先我们创建自己的类A,然后让他继承回调的接口C(在这就是listener,这样类A就成了listener的子类了,我们就可以在类B中通过listener来定义得到类A)然后创建一个系统提供的类B(比如说button,其实他是View的子类),我们再在A中使用创建出来的类B调用B类(系统类)中已知的方法(setOnClickListener),参数是this(注意!this其实就是我们类A的一个函数指针,这样我们就可以在类B中明确的创建出类A),然后用A调用B中已知的一个方法(不难发现,这个方法在A中是没有入口的,其实这个方法是为类B提供用来回调的方法,比如说:onClick())
下面就是代码解析:
这里是接口C
public interface OnClickListener {
/**
* @param v The view that was clicked.
*/
void onClick(View v);
}
这里是类A
<pre name="code" class="html">public class MainActivity extends Activity implements OnClickListener{
//这里就是创建的类B
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button1);
//这里我们调用B类中的方法,目的其实是为了让B得到A的函数指针
button.setOnClickListener(this);
}
//这里就是回调方法,B可以通过得到的A的对象来调用这个方法
@Override
public void onClick(View v) {
System.Out.println("OnClick");
}
}
<pre name="code" class="html">这里是系统类B:
这个函数是为了得到A的函数指针this的:
<pre name="code" class="html">public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
这个函数是用来回调A中的onClick方法的
<pre name="code" class="html">public boolean performClick() {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
if (mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
<span style="white-space:pre"> </span> //回调方法
mOnClickListener.onClick(this);
return true;
}
return false;
}