在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误。那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理。
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
详细解释:这样,在需要的时候,可用Caller对象的mCallback接口成员 调用callback()方法,完成回调。
回调机制在Android框架中的使用
在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
  实例(对于Android界面上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();
      }
    }
机制原理如上,那数据传递依靠接口怎么传递呢?上代码:
 /* 
 * @author sunglasses
 * @category 利用xUtils框架封装get方法,IOAuthCallBack是数据接口回调,send方法里面 有异步任务方法,
 * 传统返回数据方法可能返回数据不正确。
 */
  public class xUtilsGet {
	public void getJson(String url,RequestParams params,final IOAuthCallBack iOAuthCallBack){
        HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(1000 * 10);
        http.send(HttpMethod.GET, url, params, new RequestCallBack<String>() {
			@Override
			public void onFailure(HttpException arg0, String arg1) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onSuccess(ResponseInfo<String> info) {
				// TODO Auto-generated method stub
				iOAuthCallBack.getIOAuthCallBack(info.result);
			}
		});
	}}
  public interface IOAuthCallBack {
	public void getIOAuthCallBack(String result);
}
       public void getCataJson(int cityId,IOAuthCallBack iOAuthCallBack) {
		String url = "xxxxxxxxx";
		RequestParams params = new RequestParams();
                params.addQueryStringParameter("currentCityId", cityId+"");
		getJson(url,params,iOAuthCallBack);}getcatajson是在你想得到数据的类中调用,然后传入参数和接口对象,接口对象中是要对最终数据进行处理。具体机制原理如上。这样就可以避免接口回调中的多线程数据不一致问题。
参考:http://www.cnblogs.com/vtianyun/archive/2012/06/19/2555427.html
如有问题请留言,转载注明出处。
Android 接口回调机制详解,布布扣,bubuko.com
原文:http://blog.csdn.net/rain_butterfly/article/details/38274137