异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图:
先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作,然而真正干活的是CallBackBody,它里面的execute才是真正要处理的事情,如果成功,则触发onSucess,否则触发onFailure。
CallBackApp做为最终的运行舞台,这里面还得单独跑一个线程,来启动CallBackTask,这样才不会阻塞后面的处理。
CallBackBody:
package com.cnblogs.yjmyzz.test.callback; public abstract class CallBackBody { void onSuccess(Object context) { System.out.println("onSuccess"); } void onFailure(Object context) { System.out.println("onFailure"); } abstract void execute(Object context) throws Exception; }
CallBackTask:
package com.cnblogs.yjmyzz.test.callback; public class CallBackTask { private CallBackBody body; public CallBackTask(CallBackBody body) { this.body = body; } protected void start(final Object context) { final Thread t = new Thread(new Runnable() { public void run() { try { body.execute(context); } catch (Exception e) { e.printStackTrace(); body.onFailure(context); } body.onSuccess(context); } }); t.start(); } }
最后测试一把:
CallBackApp:
package com.cnblogs.yjmyzz.test.callback; /** * Created by jimmy on 8/13/15. */ public class CallBackApp { public static void main(String[] args) { System.out.println("准备开始执行异步任务..."); final Object context = "上下文信息"; new CallBackTask(new CallBackBody() { @Override void execute(Object context) throws Exception { System.out.println("\n正在执行耗时操作..."); System.out.println(context); Thread.sleep(5000); System.out.println("\n执行完成!"); } void onSuccess(Object context) { System.out.println("\n成功后的回调函数..."); System.out.println(context); } void onFailure(Object context) { System.out.println("\n失败后的回调函数..."); System.out.println(context); } }).start(context); System.out.println("\n异步任务已经开始,请等待完成..."); } }
运行结果:
准备开始执行异步任务...
正在执行耗时操作...
上下文信息
异步任务已经开始,请等待完成...
执行完成!
成功后的回调函数...
上下文信息