您的位置:首页 > 编程语言 > Java开发

Java中函数回调机制的深入理解

2017-09-17 15:06 435 查看
以前不理解什么叫做回调,当然即便是现在也有些云里雾里的,因为回调在昨天、今天、明天的开发工作中依然有着重要的作用(开个玩笑),当然就回调的重要性而言,在今后java开发的工作中还是占有举足轻重的地位的。比如流行的MVP框架,就是基于java回调机制的,所以回调机制不懂,那么MVP框架也就难理解了。因此没有办法即便是不懂,也只能是多看多练多结合实例,今天写篇随笔将近来看过的诸多关于回调的博客,整理一下,行程自己的理解,以便加深对回调机制的理解:

说起回调,首先什么叫做回调,网上看了一篇文章,里面有比较详尽的定义描述,这里摘抄下来,供自己理解:

Java允许我们调用接口中的方法,但是有一个前提,就是编译的时候接口的对象必须是一个具体的类,并且这个类实现了接口。这样当我们调用接口的方法的时候,接口的具体的子类中的具体方法就会被调用,这就是回调。



看起来很绕,但是重要的事情说三遍,在心里慢慢默念几遍,深入骨髓,就懂了






回调简单来讲就是:

A类调用B类中的某个具体方法C,然后B类反过来调用A类具体的方法D,D方法就是回调方法。

从其他博客里面找了一个我自认为比较简单易懂的回调方式,如下:

1.A类实现了接口CallBack callBack;

2.A类中有一个B类的引用b;

3.B类中有一个参数为callBack的方法f(CallBack
callBack);

4.A类中b对象调用B类的方法f(CallBack
callBack);----(A类调用B类中的某个具体方法C)

5.然后就可以在B类中调用A的方法了;

具体代码举例如下:

/**
* 这是一个回调接口
*/
public interface CallBack {
/**
* @param result
*/
public void solve(String result);
}
/**
* A类
* 实现了一个回调接口CallBack,相当于----->1
*/
public class A implements CallBack {
/**
* B类对象的引用
* 相当于----->2
*/
private B b;

/**
* A的构造方法,持有B类的引用
* @param b
*/
public A(B b){
this.b = b;
}

/**
*
* @param question
*/
public void askQuestion(final String question){

/**
* 这就相当于A类调用B的方法C--->4
*/
b.f(A.this, question);
}

/**
* A类中的回调方法
*/
@Override
public void solve(String result) {
System.out.println("我是A类中的回调方法");
}
}




/**
* B类
*/
public class B {
/**
* 相当于B类有参数为CallBack callBack的f()---->3
* @param callBack
* @param content
*/
public void f(CallBack callBack,String content){
/**
* 这就相当于B类反过来调用A的方法D--->5
*/
callBack.solve(content);
}
}


通过上面的小例子大致上对回调机制有些简单的了解。实际上在我们日常的开发中对回调机制最经常的使用便是点击事件了。Android 中View的点击方法Onclick();当然我们都知道Onclick()就是一个回调方法,当用户点击View的时候的时候,系统执行的就是这个方法。比如:Button按钮等等。

//这个是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);
}

/**
* 这个就相当于Class A
* 实现了 OnClickListener接口---->1
*/
public class MainActivity extends Activity implements OnClickListener{
/**
* Class A 包含Class B的引用----->2
*/
private Button button;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button1);

/**
* Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C ---->3
*/
button.setOnClickListener(this);
}

/**
* 用户点击Button时调用的回调函数,你可以做你要做的事
* 这里我做的是用Toast提示OnClick
*/
@Override
public void onClick(View v) {
Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();
}
}


以下是setOnclickListener方法,相当于B类

/**
* 这个View就相当于B类
*/
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}
*/
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 thi
ded8
s 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);
return true;
}

return false;
}
}


以上就是我对java回调机制的理解。

随笔参考:http://blog.csdn.net/xiaanming/article/details/8703708/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: