回调

什么是回调

回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百度百科中是这样的:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用.

  • 回调的概念:A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。举个例子就是,我们想要问别人一道题,我们把题跟对方说了一下,对方说好,等我做完这道题,我就告诉你,这个时候就用到了回调,因为我们并不知道对方什么时候会做完,而是对方做完了来主动找我们。

  • 同步回调
    代码运行到某一个位置的时候,如果遇到了需要回调的代码,会在这里等待,等待回调结果返回后再继续执行。

  • 异步回调
    代码执行到需要回调的代码的时候,并不会停下来,而是继续执行,当然可能过一会回调的结果会返回回来。

实例分析

现在来分析分析下Android View的点击方法onClick()。我们知道onclick()是一个回调方法,当用户点击View就执行这个方法,我们用Button来举例好了

1
2
3
4
5
6
7
8
9
10
11
12
//这个是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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.example.zhongxianfeng.demo_service;
<!--
MainActivity实现了 OnClickListener接口,并重写了其onClick方法
-->
public class MainActivity extends AppCompatActivity implements OnClickListener {
public static final String TAG = "MainActivity";
private Button start_Service ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate: MainActivity thread id"+Thread.currentThread().getId());
start_Service = (Button)findViewById(R.id.start_Service);
<!--
MainActivity 调用View的方法,而Button extends View----->A类调用B类的某个方法 C
-->
start_Service.setOnClickListener(this);//此处传入的是MainActivity对象,其会向上转型为OnClickListener
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.start_Service:
Intent startIntent = new Intent(this,MyService.class);
startService(startIntent);
break;
default:
break;
}
}
}

setOnClickListener方法对应的部分源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* 这个View就相当于B类
*/
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
protected OnClickListener mOnClickListener;
/**
* setOnClickListener()的参数是OnClickListener接口------>背景三
* 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);
}
mOnClickListener = l;
}
/**
* Call this view's OnClickListener, if it is defined.
*
* @return True there was an assigned OnClickListener that was called, false
* otherwise is returned.
*/
public boolean performClick() {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
if (mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
//这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法。
mOnClickListener.onClick(this); //此处的mOnClickListener也就是MainActivity对象
return true;
}
return false;
}
}