Java 回调

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();
	}
}


这个例子可以用于异步加载图片,假设有一张图片需要显示,在加载图片之前我们首先用一张默认的图片显示出来,

然后提交任务去异步加载,加载完成以后,回调方法可以传回来一个图片,显示出来就可以了,

但是实际中可能会使界面啊出现一闪一闪的情况,如果界面上有多张图片需要显示。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值