回调函数说白了就是定义一个函数,然后通过参数传递给另一个函数调用。回调不仅是一种技术,更是一种编程思想。
回调函数设计的意义
比如有两个类分别为A和B,B声明了一个借口名字为OnXXXListener,A实现了这个接口,并通过方法(构造,普通函数(setxxx等)等传到B中),B中就可以通过调用接口函数。实际是调用的A里面接口实现的函数。
这样做的好处是,比如B想要把一个对象s传入到A中处理,便可以方便的通过接口函数传过去。
自定义dialog的一个回调例子
来看一个片段:
Dialog_edit.java : 相当于类B
public class Dialog_edit extends AlertDialog implements OnClickListener {
private String text = "";
private EditText edit;
private OnDateSetListener mCallback;
private LinearLayout layout;
public interface OnDateSetListener {
void onDateSet(String text);
}
protected Dialog_edit(Context context, String title, String value,
OnDateSetListener Callback) {
super(context);
mCallback = Callback;
TextView label = new TextView(context);
label.setText("hint");
// setView(label);
edit = new EditText(context);
edit.setText(value);
layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
// LinearLayout.LayoutParams param =
// new LinearLayout.LayoutParams(100, 40);
// layout.addView(label, param);
LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(200,
50);
layout.addView(edit, param2);
setView(layout);
setTitle(title);
setButton("确定", this);
setButton2("取消", (OnClickListener) null);
}
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
// Log.v("cola", "U click which=" + which);
text = edit.getText().toString();
Log.v("cola", "U click text=" + text);
if (mCallback != null)
mCallback.onDateSet(text);
}
}
Frm_Editacctitem.java : 相当于类A
首先实现该接口:
private Dialog_edit.OnDateSetListener mDialogClick_new = new Dialog_edit.OnDateSetListener() {
public void onDateSet(String text) {
Log.v("cola", "new acctitem");
billdb.Acctitem_newitem(text, ExpandableListView
.getPackedPositionGroup(info.packedPosition));
updatedisplay();
}
};
接着把接口对象通过函数传到B中:
newdialog = new Dialog_edit(this, "请输入新增账目的名称", "",
mDialogClick_new);
newdialog.show();
总结:
这样就可以在B中调用接口函数时,其实就是调用的A的实现接口的函数。且能够传递B中的变量给A,接口又可以让别人写,多好啊。
是不是人的一个回调列子
Switch.java: 相当于A
public class Switch {
//一个判断传入参数是不是人的类,我是个机器,本身不知道传入的东西是不是人,我需要提供一个外部接口,帮我判断。
private String souce;
private OnJudgeListener mOnJudgeListener;
public interface OnJudgeListener {
boolean onJudgeSet(String s);
}
public Switch(OnJudgeListener onJudgeListener) {
// TODO Auto-generated constructor stub
mOnJudgeListener = onJudgeListener;
}
public void setSource(String souce){
this.souce = souce;
}
public void check(){
System.out.println("checking----");
if(mOnJudgeListener.onJudgeSet(souce)){
System.out.println("人");
} else{
System.out.println("不是人");
}
}
}
People.java: 相当于B
public class Person {
public static void main(String args[]) {
Switch s = new Switch(new Switch.OnJudgeListener() {
@Override
public boolean onJudgeSet(String s) {
// TODO Auto-generated method stub
if ("people".equals(s)) {
return true;
} else {
return false;
}
}
});
s.setSource("people");
s.check();
s.setSource("fish");
s.check();
}
}
总结2:
B函数没有判断条件‘是不是人 ’的功能,全凭它提供了一个接口来判断,并返回结构供它自己处理。