一、回调函数

  回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

二、经典的例子:

      经理、员工。经理要出差,出差期间有件事情需要员工完成并要知道事情的进度和结果。所以必须有一个callback的方法告诉result。

三、下面是button的回调例子

a、定义接口

public interface OnClickListener {
      public void OnClick(Button b);
    b. 定义Button
     public class Button {
      OnClickListener listener;
      public void click() {
        listener.OnClick(this);
      }
      public void setOnClickListener(OnClickListener listener) {
        this.listener = listener;
      }
     }
    c. 将接口对象OnClickListener 赋给 Button的接口成员
    public class Activity {
      public Activity() {
      }
      public static void main(String[] args) {
        Button button = new Button();
        button.setOnClickListener(new OnClickListener(){
          @Override
          public void OnClick(Button b) {
            System.out.println("clicked");
          }
        });
        button.click(); //user click,System call button.click();
      }
    }
1. /**
2.  * 这是一个回调接口
3.  * @author xiaanming
4.  *
5.  */
6. public interface
7. /**
8.      * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数
9.      * @param result 是答案
10.      */
11. public void
12. }


[java] view plain copy


    1. /**
    2.  * 这个是小王
    3.  * @author xiaanming
    4.  * 实现了一个回调接口CallBack,相当于----->背景一
    5.  */
    6. public class Wang implements
    7. /**
    8.      * 小李对象的引用
    9.      * 相当于----->背景二
    10.      */
    11. private
    12.   
    13. /**
    14.      * 小王的构造方法,持有小李的引用
    15.      * @param li
    16.      */
    17. public
    18. this.li = li;  
    19.     }  
    20.       
    21. /**
    22.      * 小王通过这个方法去问小李的问题
    23.      * @param question  就是小王要问的问题,1 + 1 = ?
    24.      */
    25. public void askQuestion(final
    26. //这里用一个线程就是异步,
    27. new Thread(new
    28. @Override
    29. public void
    30. /**
    31.                  * 小王调用小李中的方法,在这里注册回调接口
    32.                  * 这就相当于A类调用B的方法C
    33.                  */
    34. this, question);   
    35.             }  
    36.         }).start();  
    37.           
    38. //小网问完问题挂掉电话就去干其他的事情了,诳街去了
    39.         play();  
    40.     }  
    41.   
    42. public void
    43. "我要逛街去了");  
    44.     }  
    45.   
    46. /**
    47.      * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法
    48.      */
    49. @Override
    50. public void
    51. "小李告诉小王的答案是--->"
    52.     }  
    53.       
    54. }


    [java] view plain copy


    1. /**
    2.  * 这个就是小李啦
    3.  * @author xiaanming
    4.  *
    5.  */
    6. public class
    7. /**
    8.      * 相当于B类有参数为CallBack callBack的f()---->背景三
    9.      * @param callBack  
    10.      * @param question  小王问的问题
    11.      */
    12. public void
    13. "小王问的问题--->"
    14.           
    15. //模拟小李办自己的事情需要很长时间
    16. for(int i=0; i<10000;i++){  
    17.               
    18.         }  
    19.           
    20. /**
    21.          * 小李办完自己的事情之后想到了答案是2
    22.          */
    23. "答案是2";  
    24.           
    25. /**
    26.          * 于是就打电话告诉小王,调用小王中的方法
    27.          * 这就相当于B类反过来调用A的方法D
    28.          */
    29.         callBack.solve(result);   
    30.   
    31.           
    32.           
    33.     }  
    34.       
    35. }

    记录:

    接口

    set
    implements
         一, 编写抽象类
    public abstract class HttpCallbacks<E> {
         /**
          * 获取数据成功
          * 
          * @param data
          *            String类型的结果
          */
         public void onSuccess(String data) {
         };
    
         /**
          * 获取数据成功
          * 
          * @param data
          *            List类型的结果
          */
         public void onSuccess(List<E> data) {
         };
    
         /**
          * 获取数据失败
          * 
          * @param errorCode
          *            错误信息代码
          * @param errorMsg
          *            错误信息数据
          */
         public void onError(int errorCode, String errorMsg) {
         };
     }

    二,作为参数回调

    public void getUser(HttpParams params,final HttpCallbacks<String> callback){
             if (NetWorkUtils.getNetworkType(DemoApplication.getInstance()) == -1) {
                 callback.onError(HttpClientHelper.DATA_FAIL_ERROR,
                         HttpClientHelper.DATA_NET_ERROR);
                 return;
             }
             //请求网络
             HttpClientHelper.post2("url", params, new HttpCallBack() {
                 @Override
                 public void onSuccess(String t) {
                     // TODO Auto-generated method stub
                     super.onSuccess(t);
                 }
                 @Override
                 public void onFailure(int errorNo, String strMsg) {
                     // TODO Auto-generated method stub
                     super.onFailure(errorNo, strMsg);
                     callback.onError(errorNo, strMsg);
                 }
             });        
         }

    三,调用参数,实现抽象方法

    RegisterMannger.getManager().getAuthcode(params,
                     new HttpCallbacks<String>() {
                         @Override
                         public void onSuccess(String data) {
                             super.onSuccess(data);
                             mServerCode = data;
                             mSubmitState = false;
                         }
    
                         @Override
                         public void onError(int errorCode, String errorMsg) {
                             super.onError(errorCode, errorMsg);
                             mDownTimer.cancel();
                             mDownTimer.onFinish();
                             mCodeBtn.setClickable(true);
                             mSubmitState = false;
                             ToastUtils.show(getActivity(), "" + errorMsg);
                         }
                     });

    简单实现

    package cn.testcallback; 
     import android.os.Bundle; 
     import android.widget.Toast; 
     import android.app.Activity; 
     /** 
     * Demo描述: 
     * Android中回调接口的使用 
     */ 
     public class MainActivity extends Activity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     init(); 
     } 
     private void init() { 
     for (int i = 0; i < 10000; i++) { 
     if (i == 9527) { 
     showToast(i, new CallBackInterface() { 
     @Override 
     public void callBackFunction(int i) { 
     Toast.makeText(MainActivity.this, "我的编号:"+i, Toast.LENGTH_LONG).show(); 
     } 
     }); 
     } 
     } 
     } 
     //定义函数,其中一个参数为CallBackInterface类型 
     private void showToast(int i, CallBackInterface callBackInterface) { 
     callBackInterface.callBackFunction(i); 
     } 
    
     //定义接口.且在接口中定义一个方法 
     public interface CallBackInterface { 
     public void callBackFunction(int i); 
     } 
     }