Android中使用回调机制特别多,今天想深入理解下回调机制是什么原理,为什么要用回调呢?有什么优点?比直接调用函数好在哪里?
百度很多,说指针的很多,没看懂。
参考大牛的文章,让我明白很多。参见:
Java/Android中的函数调用&回调函数&自定义回调函数
我自己写的小例子:
3个类:
1、接口
public interface Callback {
public abstract void callback();
}
2、A类
public class A {
public void eat(Callback callback){
callback.callback();
}
}
3、B类
public class B extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
A a = new A();
a.eat(new Callback() {
@Override
public void callback() {
Log.i("dgl","callback 方法");
}
});
}
}
回调函数注意点:
1、方法中的参数包含接口,但是这个方法不去实现;例如A中的eat()方法;
2、谁调用eat()方法,谁实现接口中的callback方法。
第二部分:分析Android原生的回调
Android源码:
1、定义接口(类似我的接口Callback);
//这个是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);
}
看看含有接口参数的方法:(类似我的类A)注意看第22行方法,方法参数是接口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}
*/
protected 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);
}
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);
mOnClickListener.onClick(this);
return true;
}
return false;
}
}
来看看Android中最常见使用回调函数:
findViewById(R.id.edit2).setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if(b){
Log.v("dgl","2获得焦点");
}else{
Log.v("dgl","2失去了焦点");
}
}
});
第三部分:问题
1、相比较直接调用,回调有什么好处?
ans:定义方法时,不用实现,谁调用谁实现。比如Button的SetOnClickListener方法,点击之后要实现什么业务功能,有开发人员自己实现。
未完待续;
欢迎拍砖。
2016/6/29 添加:
B类还可以转型成C类:
public class C extends Activity implements Callback{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
A a = new A();
a.eat(this);
}
@Override
public void callback() {
Log.i("dgl","callback 方法");
}
}
有个问题:参数怎么传进来的呢?