Java中实现CallBack功能

本文通过实例讲解了Java中如何实现Callback功能。创建主函数类、Callback接口类和业务处理类,业务处理完成后调用Callback接口的回调函数。回调原理在于将实现了接口的匿名类对象传入业务类,业务类执行完毕后调用接口方法,实现特定功能。此外,文中还提及了受启发的文章,该文章涉及Android中使用SoftReference进行内存缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情。

现在模拟一下这个情景:

定义三个类。分别是主函数类。callback函数的接口类。业务处理类。在业务处理类中,处理完业务之后,执行一个callback函数。

package comz;

public class Main {
	public static void main(String[] args) {
		new TestCallBack().compute(1000, new ComputeCallBack() {

			@Override
			public void onComputeEnd() {
				System.out.println("end back!!!");

			}
		});
	}
}

这是主函数类。new了一个业务处理类来处理逻辑,并在处理完毕之后,执行callback函数。

package comz;

public class TestCallBack {

	public void compute(int n, ComputeCallBack callback) {
		for (int i = 0; i < n; i++) {
			System.out.println(i);
		}
		callback.onComputeEnd();
	}
}

这是业务处理类。仅仅输出一些数字,然后执行回调函数。

package comz;

public interface ComputeCallBack {
	public void onComputeEnd();
}

这是回调函数的接口。

--------------------------------------

运行上面的代码,就会在输出结束的时候调用在Main里面的callback函数,输出System.out.println("end back!!!");

--------------------------------------

这里的原理是:

在主类中,新建业务类的时候,传递进去的第二个参数是一个实现了回调接口的匿名类对象。

在业务类中,我们调用了这个对象的onComputeEnd方法。在执行onComputeEnd的时候,jvm会找到这个对象的函数实现并调用。于是就输出了end back!!!

---------------------------------------

写这篇文章的灵感来自于这里

这篇文章介绍了安卓下,下载图片并缓存。文章中亮点不仅仅是回调函数的使用,而且还使用了SoftReference来做内存缓存。

下面的代码,用SoftReference写入内存缓存:

/**
	 * 从网络端下载图片
	 * 
	 * @param url
	 *            网络图片的URL地址
	 * @param cache2Memory
	 *            是否缓存(缓存在内存中)
	 * @return bitmap 图片bitmap结构
	 * 
	 */
	public Bitmap getBitmapFromUrl(String url, boolean cache2Memory) {
		Bitmap bitmap = null;
		try {
			URL u = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) u.openConnection();
			InputStream is = conn.getInputStream();
			bitmap = BitmapFactory.decodeStream(is);

			if (cache2Memory) {
				// 1.缓存bitmap至内存软引用中
				imageCache.put(url, new SoftReference<Bitmap>(bitmap));
				if (cache2FileFlag) {
					// 2.缓存bitmap至/data/data/packageName/cache/文件夹中
					String fileName = getMD5Str(url);
					String filePath = this.cachedDir + "/" + fileName;
					FileOutputStream fos = new FileOutputStream(filePath);
					bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
				}
			}

			is.close();
			conn.disconnect();
			return bitmap;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

下面是从内存缓存中读取图片并返回:;

/**
	 * 从内存缓存中获取bitmap
	 * 
	 * @param url
	 * @return bitmap or null.
	 */
	public Bitmap getBitmapFromMemory(String url) {
		Bitmap bitmap = null;
		if (imageCache.containsKey(url)) {
			synchronized (imageCache) {
				SoftReference<Bitmap> bitmapRef = imageCache.get(url);
				if (bitmapRef != null) {
					bitmap = bitmapRef.get();
					return bitmap;
				}
			}
		}
		// 从外部缓存文件读取
		if (cache2FileFlag) {
			bitmap = getBitmapFromFile(url);
			if (bitmap != null)
				imageCache.put(url, new SoftReference<Bitmap>(bitmap));
		}

		return bitmap;
	}


 

基本概念 if you call me, i will call back 什么是回调函数 回调函数(callback Function),顾名思义,用于回调的函数。 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性: >属于工作流的一个部分; >必须按照工作流指定的调用约定来申明(定义); >他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能; 回调机制 回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。 java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 >同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用; >回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口; >异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。 回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值