android 回调

来源:互联网 发布:软件委托开发保密协议 编辑:程序博客网 时间:2024/05/18 02:06
一、回调函数

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

二、经典的例子:

      经理、员工。经理要出差,出差期间有件事情需要员工完成并要知道事情的进度和结果。所以必须有一个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 CallBack {  
  7.     /** 
  8.      * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数 
  9.      * @param result 是答案 
  10.      */  
  11.     public void solve(String result);  
  12. }  

 

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


 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 这个就是小李啦 
  3.  * @author xiaanming 
  4.  * 
  5.  */  
  6. public class Li {  
  7.     /** 
  8.      * 相当于B类有参数为CallBack callBack的f()---->背景三 
  9.      * @param callBack   
  10.      * @param question  小王问的问题 
  11.      */  
  12.     public void executeMessage(CallBack callBack, String question){  
  13.         System.out.println("小王问的问题--->" + question);  
  14.           
  15.         //模拟小李办自己的事情需要很长时间  
  16.         for(int i=0; i<10000;i++){  
  17.               
  18.         }  
  19.           
  20.         /** 
  21.          * 小李办完自己的事情之后想到了答案是2 
  22.          */  
  23.         String result = "答案是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);
}
}


0 0
原创粉丝点击