代码抽取是一个很好的变成习惯,一定要深刻理解。以一个监听器接口为例
1.抽取代码成方法
2.注释方法,申请监听监听器添加方法
3.监听器做参数传给工具 对象
4.听器内部获取参数
一定要养成 从底层到上层的习惯,而不是反之。
底层到上层一步步是怎么抽取的
从上层到底层:一步步是如何继 实现和复写的
java编程一定要养成抽取的习惯
http://blog.csdn.net/a78270528/article/details/46918601
回调机制
简单来说:回调函数就是预留给系统调用的函数,而且我们往往知道函数被调用的时机。
简单例子,考试答题第一件事就是写上学号和姓名。这里填写的学号和姓名不是自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统调用的),这其实就是一个回调的应用。老师提供接口(输入姓名 学号的规则),我们利用接口注册。
异步+回调的编程模式,按钮点击监听其实就是“回调”最常见的应用场景之一。我们不会显式的调用onclick方法。用户触发了该按钮的点击事件之后,会由Android系统自动调用。
activity的整个生命周期也是回调函数在发生作用。
举个例子:我打电话给你请教问题,你一时想不出解决方法,我又不能干等,于是我们呢约定:等你有了答案打手机通知我,过了xx分钟,我的手机响了,你说问题已经搞定,应该如此这般处理。
其中你后来打手机告诉我结果就是一个回调的的过程。我的手机号码必须在之前告诉你,这就是一个注册回调函数的过程。我的手机号码应该有效,并且能够接收你的呼叫,这是回调函数必须符合接口规范。
C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。
简单来说:回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机,那我们继续完善下上面的那幅图。
public class You implements Runnable {
public void You(){
}
private String who;
private ContactInterface callback;
//调用此方法就表示有人联系你了,注册到你这来 即set方法就是图中的r方法
public void setCallback(String who,String question,ContactInterface callback) {
this.who=who;
this.callback = callback;
System.out.print("你说:当前联系我的人是"+who+",问题是:"+question);
}
//接口类,定义规范
public interface ContactInterface{
public void callBackByTel(String answer);
}
@Override
public void run() {
try {
Thread.sleep(1000);
handleThings();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void handleThings() {
for(int i=0;i<100000;i++){
if(i == 0){
System.out.println("你正在思考问题.....");
}
}
String answer="答案是A";
System.out.print("你说:想到答案了,准备打回去给"+who+"告诉他答案");
//s回调c中的方法b
callback.callBackByTel(answer);
}
}
public class Me {
public static void main(String[] args){
Me me=new Me();
me.hasQuestion();
}
private void hasQuestion() {
You you = new You();
you.setCallback("蜗牛", "某道题答案是什么", new You.ContactInterface() {
@Override
//此即为回调函数
public void callBackByTel(String answer) {
System.out.print("我说:嗯,好的,我收到答案了"+answer+"谢谢你!");
}
});
new Thread(you).start();
}
}