回调机制详解

当时我思考了下就让他在异步完成后回调一下将值返回……因为对方是初学者我就给他简单解释了下Android的回调……说了一下午他都没弄明白……原因不是我讲得不够详细而是他陷进了他异步的问题……他把他那个问题和我讲的回调混在了一起……一直跳不出那个思维,其实回调机制很好理解,也基于这个原因,也算为了这位仁兄,我决定用最直白的语言来给大家讲讲Android的回调机制是怎么个回事,阅读这篇文章你不需要太高深的技术功底,只要你会点JAVA基本的知识,知道什么叫类什么叫接口怎么创建项目,我想相信你看完本章后必定会有收获。

废话不多说,像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。

首先在Eclipse中新建一个Java项目:CallBackDemoInJava;

然后再新建三个类:Manager(该类用来模拟总经理)、Personnel(该类用来模拟员工)、Main(主类);


Manager的代码如下:

package com.aige.test;

/**
 * @description 该类用来模拟总经理
 * @author Aige
 * @since 2014/11/6
 */
public class Manager {
	/**
	 * @param personnel
	 *            传入一个员工类的对象
	 */
	public Manager(Personnel personnel) {

		// 想让该让员工做什么
		personnel.doSomething(this, "整理公司文件");
	}

	/**
	 * @description 当员工做完总经理让他做的事后就通过该方法通知总经理
	 * @param result
	 *            事情结果
	 */
	public void phoneCall(String result) {
		System.out.println("事情" + result);
	}
}
Manager类是个模拟总经理的类,当该类的对象被造出来后就会通过Personnel的对象去执行Personnel中的doSomething方法告诉员工做些什么

Personnel的代码如下:

package com.aige.test;

/**
 * @description 该类用来模拟员工
 * @author Aige
 * @since 2014/11/6
 */
public class Personnel {
	public void doSomething(Manager manager, String task) {

		// 总经理通过doSomething方法告诉员工要做什么
		System.out.println("总经理要你做" + task);

		String result = "做完了";

		// 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果
		manager.phoneCall(result);
	}
}
总经理通过调用Personnel中的doSomething方法告诉员工该做些什么,当员工做完后就通过Manager中的phoneCall方法通知总经理结果

那么好的!万事俱备,我们在Main中测试运行下代码看看结果:

package com.aige.test;

public class Main {
	public static void main(String[] args) {
		// 首先我们需要一个员工
		Personnel personnel = new Personnel();

		// 其次把这个员工指派给总经理
		new Manager(personnel);
	}
}

代码执行结果如下:


回到我们刚才举的那个现实中的例子:总经理出差前要你去办件事情,这件事情通过doSomething告诉你了,事情要是办完了就打总经理的电话phoneCall通知他一声。这里的phoneCall我们就称为回调方法,为什么称之为回调呢?你问我我也不清楚哈~这你得问Sun公司了,不过我们从代码的执行过程可以看出数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?现在我们来总结下满足回调的两个基本条件:

1.Class A调用Class B中的X方法

2.ClassB中X方法执行的过程中调用Class A中的Y方法完成回调

一切看上去都很完美~以上例子代码简单通俗地描述了回调,但是这里我就会有这样一个疑问:假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:


CallBack代码如下:

package com.aige.test;

/**
 * @description 回调接口
 * @author Aige
 * @since 2014/11/6
 */
public interface CallBack {

	// 回调方法
	public void backResult(String result);
}

Manager代码改造后如下:

实现CallBack接口重写backResult方法

package com.aige.test;

/**
 * @description 该类用来模拟总经理
 * @author Aige
 * @since 2014/11/6
 */
public class Manager implements CallBack {
	/**
	 * @param personnel
	 *            传入一个员工类的对象
	 */
	public Manager(Personnel personnel) {

		// 想让该让员工做什么
		personnel.doSomething(this, "整理公司文件");
	}

	/**
	 * @description 当员工做完总经理让他做的事后就通过该方法通知总经理
	 * @param result
	 *            事情结果
	 */
	public void backResult(String result) {
		System.out.println("事情" + result);
	}
}

Personnel代码改造后如下:

doSomething方法不再传入一个Manager对象而是一个CallBack接口:

package com.aige.test;

/**
 * @description 该类用来模拟员工
 * @author Aige
 * @since 2014/11/6
 */
public class Personnel {
	public void doSomething(CallBack callBack, String task) {
		// 总经理通过doSomething方法告诉员工要做什么
		System.out.println("总经理要你做" + task);

		String result = "做完了";

		// 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果
		callBack.backResult(result);
	}
}
Main代码不变,执行结果也是一样的。

至此,回调的基本概念差不多就是这样了~其实回调真心不难理解,但是回调在Android中相当重要,几乎处处可见回调机制,如果你能理解到回调的奥秘~我相信对你的Android技术是一个不小的提升~~吃药去了!

  • 68
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 43
    评论
Java回调函数是一种在Java中实现事件驱动编程的重要机制回调函数允许您将一个函数作为参数传递给其他函数,并在需要时调用它。回调函数是Java中实现事件驱动编程的重要工具,可以用于处理各种事件,如用户交互、定时器触发、数据读取等。 在Java中,回调函数通常使用接口来实现。接口是一种定义了一组方法的抽象类型,这些方法在实现时可以由任何类来实现。回调函数通常通过实现接口中的方法来实现,并在需要时调用这些方法。 下面是一个简单的回调函数示例: ```java interface Callback { void call(); } public class MyClass { private Callback callback; public void doSomething(Callback callback) { this.callback = callback; // 做一些事情 if (callback != null) { callback.call(); } } } ``` 在上面的示例中,`Callback` 接口定义了一个名为 `call()` 的方法,用于在适当的时候被调用。`MyClass` 类将 `Callback` 接口的实现作为参数传递给 `doSomething()` 方法,并在完成后调用 `call()` 方法。 当您需要使用回调函数时,您可以将一个实现了回调接口的类的实例传递给需要使用回调的方法。该方法将在适当的时候调用回调方法,并将结果传递给该实例的方法或属性。这样,您就可以根据需要执行其他操作或处理回调结果。 使用回调函数可以简化代码并提高代码的可维护性,因为它允许您将复杂的事件处理逻辑封装在单独的方法中,并使用回调函数将其与主程序分离。这使得代码更加清晰和易于理解,并且可以在需要时轻松地扩展和修改代码。 需要注意的是,使用回调函数时需要注意线程安全问题。由于回调函数通常是在其他线程中执行的,因此需要确保在调用回调方法时正确地同步和保护数据,以避免出现并发问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值