回调函数

回调函数原理与实践

回调函数说白了就是定义一个函数,然后通过参数传递给另一个函数调用。回调不仅是一种技术,更是一种编程思想。

回调函数设计的意义

比如有两个类分别为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函数没有判断条件‘是不是人 ’的功能,全凭它提供了一个接口来判断,并返回结构供它自己处理。

转载于:https://my.oschina.net/u/660536/blog/370827

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值