一、回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
二、经典的例子:
经理、员工。经理要出差,出差期间有件事情需要员工完成并要知道事情的进度和结果。所以必须有一个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. }
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. }
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);
}
}