接上一篇函数指针的总结
===============================================
android callback的学习:
先贴一段callback维基百科的解释吧,回头再写几个例子看看
In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback or it might happen at later time, as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable.
百科里说明了回调函数的关键是:将一段代码作为参数传递,而这段代码将会在某个时刻被执行。这个某个时刻可以是手动调用方法,而android里大多数情况是系统会触发这个事件,比如说点击屏幕这样的操作。
这两天断断续续也看了很多网上对于callback的解释,大概有了对于callback的理解,觉得写得比较好的是下面这篇博客:
http://blog.csdn.net/very_caiing/article/details/41898439
自己也跟着callback的实例写了demo,上面文章中的最后一个实例确实比较实用,也很巧妙~
我们假设有两个角色,A和B,A申明了一个回调接口,并定义了一个规范(接口里的函数),但还不知道怎么实现,希望B告诉他怎么做。
以下是我个人的理解:,
1,A的角色就类似老师,老师给全班50个同学布置了家庭作业,这个接口就是他写的题目。
//回调接口
public interface ICallBack{
void lifeExec();
}
ps:老师给的题目很简短,就说同学们要根据自己的发挥去写lifeExec()。
2,拿到题目学生就可以去写了么,还没有,老师给的题目太大了,他还需要做个限制,他说今天题目是特别针对学生对象的,大家不要离题了。于是他给了下面这个类对象StudentObject
public class StudentObject {
private ICallBack callBack;
public void setCallBack(ICallBack callBack){
this.callBack = callBack;
}
public void doSth(){
this.callBack.postExec();
}
}
这里面的setCallBack,是给学生提交自己的作业用的,学生通过setCallBack可以提交自己的作业,老师通过doSth()可以查看某个学生的作业内容。
3, 学生B开始做题目,做完提交后,在某个时间老师去查看了,学生B的作业内容才被调用并显示出来。
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
StudentObject obj = new StudentObject();
obj.setCallBack(new ICallBack(){
//something to be done this.
public void postExec() {
// TODO Auto-generated method stub
System.out.println("学生B的答案");
}
});
System.out.println("学生B把自己的作业已经提交了");
//
Thread.sleep(5000);
System.out.println("过了一段时间,老师看到了学生B的答案...");
obj.doSth();
}
最后的output是这样的:
学生B把自己的作业已经提交了
过了一段时间,老师看到了学生B的答案...
学生B的答案
下面是上述博客中的一个计算函数执行时间的例子,在这里copy一下,希望后面自己能将callback应用到更多的实际场景中。
普通的计算函数执行时间:
public class TestObject {
/**
* 一个用来被测试的方法,进行了一个比较耗时的循环
*/
public static void testMethod(){
for ( int i= 0 ; i< 100000000 ; i++){
}
}
/**
* 一个简单的测试方法执行时间的方法
*/
public void testTime(){
long begin = System.currentTimeMillis(); //测试起始时间
testMethod(); //测试方法
long end = System.currentTimeMillis(); //测试结束时间
System.out.println("[use time]:" + (end - begin)); //打印使用时间
}
public static void main(String[] args) {
TestObject test=new TestObject();
test.testTime();
}
}
public class Tools {
/**
* 测试函数使用时间,通过定义CallBack接口的execute方法
* @param callBack
*/
public void testTime(CallBack callBack) {
long begin = System.currentTimeMillis(); //测试起始时间
callBack.execute(); ///进行回调操作
long end = System.currentTimeMillis(); //测试结束时间
System.out.println("[use time]:" + (end - begin)); //打印使用时间
}
public static void main(String[] args) {
Tools tool = new Tools();
tool.testTime(new CallBack(){
//定义execute方法
public void execute(){
//这里可以加放一个或多个要测试运行时间的方法
TestObject.testMethod();
}
});
}
}
当然还有一个 CallBack接口,里面有一个函数execute();
好了Android的callback就先学习到这里。