回调函数是什么

1.为什么需要回调函数这个概念

	1.funcA()调用funcB(param),并且需要得到funcB(param)返回的result,这时才需要用到回调函数,不然只需要开启异步线程即可
	
	2.funcA(){
	   result = funcB(param);
	   需要借助result才能完成的业务;
	   不需要result也能完成的业务;
	}
	假如这时,funcB(param)需要执行20s,那我们A需要等20s才能进行下面的操作,这时我们考虑异步调用
	
	3.funcA(){
	  result = funcB(param);这步我们开启Thread异步调用
	  需要借助result才能完成的业务;
	  不需要result也能完成的业务;
	}
	虽然这里调用B是异步调用的,但是必须要等待thread返回结果,我们才能执行下面的内容
	所以你可能非常容易想到2中解决方案
		1.主线程for循环判断reuslt是否返回
		2.阻塞等待result返回之后再执行
	这样跟不开启线程的效果一样
	
	4.所以我们进一步考虑,将主线程中需要借助result才能完成的业务放到funcB()中
	这样,主线程可以接着完成不需要result就能执行的业务,这样效果会大大提升
	
	5.但是不能将它写死到funcB中,所以我们想要是能将需要借助result才能完成的业务
	抽取成callback()方法,然后通过传参的方式,传给 funcB(param,callback)
	
	6.这里我们将callback设计成一个接口,里面的方法定义成需要result才能执行的业务
	然后funcA()调用者趋去实现,callback接口,这样我们传参数的时候,funcB(param,new A())即可,

	7.public interface CallBack{
		Object callBack(Object result);
	}
	  public class A implents CallBack{
	  	public void funcA(){
	  		funcB(param,this); 这里开启了Thread;
	  		
	  		不需要reuslt就可以执行的业务;这里可以不用等待funcB返回,直接执行
	  	}
	  	public Object callBack(Object result){
	  		需要result 才能执行的A的业务;
	  	}
	  }
	  
	  public class B{
	  	public void funcB(Object param,Callback callBack){
	  		do ....,有了result;
	  		callback.callback(result);
	  	}
	  }

	8.简单来说,为了提高调用的效率,采用异步回调函数,既可以解放funcA(),让起不用等待funcB()执行完后再执行
	funcB执行完后,直接调用回调函数,其核心就是回调函数接口

Guess you like

Origin blog.csdn.net/Chen4852010/article/details/121060443