什么是回调
(1) 概念
回调发生在两个类中,即A类方法a()调用了B的方法b(),然后B为了将完成的结果result主动反馈给A而调用其回调方法 callback(),这是一种双向的调用方式。如boss很忙要员工将这周的手机销量整理出来报告给他,然后员工将统计结果主动反馈给boss。
(2) 分类
同步回调:代码运行到回调代码处,就会等待执行结果,当结果返回后继续执行后面的逻辑。因同步调用有一个停下来等待过程,所以回调代码处的函数执行时间不能太长,如果太长可能导致阻塞,也就是后面的逻辑无法执行,从而导致整个流程卡住。
异步回调:是为了弥补同步回调可能引起阻塞的缺陷,而产生一种新的调用方式。其实异步回调就是在A类中a()方法处开启线程的方式调用B类中b()方法,后面的代码逻辑直接往下执行,这时b()方法执行时间长短都不会引起方法a()阻塞了。
模拟场景代码
写一个异步回调的例子:boss让员工统计手机销量数据,完成后反馈给boss。
定义一个回调接口,用于员工向boss反馈查询结果:
1 package com.jsnh.callback; 2 3 /** 4 * 回调接口 5 * 6 */ 7 public interface CallbackStatistics { 8 public void Sales_Statistics(int number); 9 }
结果反馈给boss,在boss对象中实现CallbackStatistics 接口:
1 /** 2 * Boss对象 3 */ 4 public class Boss implements CallbackStatistics{ 5 6 private Staff staff; 7 8 public Boss(Staff staff) { 9 this.staff = staff; 10 } 11 12 public void askStatistics() { 13 new Thread(new Runnable() { 14 15 @Override 16 public void run() { 17 staff.queryStaStatistics(Boss.this); 18 } 19 }).start(); 20 System.out.println("异步回调处理完成"); 21 } 22 23 @Override 24 public void Sales_Statistics(int number) { 25 System.out.println("Lisan你反馈给我的统计是:" + number ); 26 } 27 }
askStatistics()相当于分派给员工的任务,开启一个线程实现异步回调;Sales_Statistics(int number)员工反馈给boss结果后,boss要做的事情。
定义一个完成任务的接口,即员工接口,传入的参数CallbackStatistics是为了让具体执行任务的员工向谁反馈结果:
1 /** 2 * 员工接口 3 */ 4 public interface Staff { 5 6 public void queryStaStatistics(CallbackStatistics callbackStatistics); 7 8 }
定义一个具体员工实现类:
1 /** 2 * Lisan完成了boss的工作任务 3 */ 4 public class Lisan implements Staff{ 5 6 @Override 7 public void queryStaStatistics(CallbackStatistics callbackStatistics) { 8 //模拟查询 9 int phoneCount = 0; 10 try { 11 Thread.sleep(5000); 12 phoneCount = 10000; 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 //向boss报告查询结果 17 callbackStatistics.Sales_Statistics(phoneCount); 18 } 19 }
测试类,验证结果:
1 /** 2 * 回调测试类 3 */ 4 public class CallbackStatisticsTest { 5 6 public static void main(String[] args) { 7 Staff staff = new Lisan(); 8 Boss boss = new Boss(staff); 9 boss.askStatistics(); 10 } 11 12 }
运行结果:
异步回调处理完成
Lisan你反馈给我的统计是:10000
参考:https://www.cnblogs.com/xrq730/p/6424471.html