Java回调在很多地方都有用到,Android,hadoop里面有很多地方使用到了回调机制,先给出代码吧,理论知识以后再补上
应用场景:客户端有一个很繁重的任务要处理,这个可能需要很长的时间,但是它去处理这个的时候又还想同时去做别的事,响应其它的请求,很常见的就是Android的activtity需要去网络加载一张图片,但是它同时还需要响应用户的点击事件,所以他就将这个任务交给另外一个任务去处理,那个任务处理完了将这个图片交给这个activity,然后这个activity将这个图片展示出来。
假设:有一个客户端Client,一个处理复杂任务的ComplexTask,ComplexTask处理完任务后需要通过一个中介物将拿到的结果返回给Client,在这个可以定义为一个接口CallBack,代码如下:
ComplexTask类:
package com.cgq.callback.b2;
public class ComplexTask {
/**
* 处理客户端提交的任务
* @param message
* @param action
* @throws InterruptedException
*/
public void handleComplexTask(Object message,CallBack action) throws InterruptedException{
//处理复杂的任务,需要花一些时间
action.execute(inverseStr((String)message));
}
/**
* 将字符串翻转
* @param str
* @return
* @throws InterruptedException
*/
private String inverseStr(String str) throws InterruptedException{
System.out.println(getClass().getName() + " say:OK! please give me a few seconds");
Thread.sleep(2000);
char[] bytes = str.toCharArray();
char tmp = ' ';
for (int i = 0; i < bytes.length /2; i++) {
tmp = bytes[i];
bytes[i] = bytes[bytes.length - i -1];
bytes[bytes.length- i - 1] = tmp;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
sb.append(bytes[i]);
}
System.out.println(getClass().getName() + " say:I have done it!");
return sb.toString();
}
public interface CallBack{
public void execute(Object... objects );
}
}
Client类:
package com.cgq.callback.b2;
import com.cgq.callback.b2.ComplexTask.CallBack;
public class Client {
//要处理的信息
private String orignalMessage;
private ComplexTask Task;
public Client(String orignalMessage) {
super();
this.orignalMessage = orignalMessage;
}
/**
* 提交复杂的任务
* @throws InterruptedException
*/
public void submitComplexTask() throws InterruptedException{
if (Task == null) {
Task = new ComplexTask();
}
printResult();
System.out.println(getClass().getName() + " say:please help me to inverse this string: " + orignalMessage);
//启动一个线程提交任务,自己去干别的事,等待结果的返回
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Task.handleComplexTask(orignalMessage, new CallBack() {
@Override
public void execute(Object... objects) {
// TODO Auto-generated method stub
orignalMessage = (String) objects[0];
printResult();
}
});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
// printResult();
}
/**
* 显示结果
*/
public void printResult(){
System.out.println(orignalMessage);
}
public static void main(String[] args) throws InterruptedException {
Client client = new Client("hello,I am client!");
client.submitComplexTask();
}
}
这个例子可以用于异步加载图片,假设有一张图片需要显示,在加载图片之前我们首先用一张默认的图片显示出来,
然后提交任务去异步加载,加载完成以后,回调方法可以传回来一个图片,显示出来就可以了,
但是实际中可能会使界面啊出现一闪一闪的情况,如果界面上有多张图片需要显示。