关于JAVA中的listener回调机制,以及其在Android中的使用

第一篇博客,献给我的舍友逼哥 @bigname22 

博客:http://my.csdn.net/bigname22



在学习Android的过程中接触到了java的回调机制,比如按钮的监听回调,又比如开启一个子线程,在子线程完成任务的时候通知主线程.

其实JAVA的回调机制并不是非常高深的原理,不需要继承什么类.  只要有一点点接口interface和多线程Thread(只要了解就行)的知识,就能够学得会.


首先,java中的回调机制,是为了解决什么问题呢?

我认为是为了实现两个类之间的合作,和信息传递.

其中一个是主类,负责调用另外一个被调用类, 而另外一个类在完成了工作之后,重新调用主类.

打个现实中的比方:我是总经理,我手头上工作很多,突然我遇到一个比较耗费时间的问题,我当然不能自己解决.所以我打电话给了我一个员工,叫他去解决问题.并且告诉他我的电话一直开着,你解决的问题就马上打回来给我.


这在JAVA中的实现:

其中A是总经理        B是员工

1 定义一个接口   2 A调用B的方法并在参数中传入一个接口实现类实例   3 B中得到参数中的接口实现类实例,并执行完任务之后,调用接口实现类实例的方法.

这样子说你可能就懵逼了.不过在下面代码中我们将一步一步慢慢解析:

首先定义一个接口:

public interface Listener {
	public void finish(int result);    //接口中唯一抽象函数,这里加不加abstract无所谓
}


首先是总经理A

public class A {

	public void workOfA() {
		System.out.println("A遇到问题,赶紧开个了线程找B");
		new Thread(new Runnable() {					//首先,我们在A工作中遇到问题时,开启了一个子线程
			@Override								//在子线程中我们创建了一个B实例,并调用了B的方法,并在参数中传入了
			public void run() {						//一个通过匿名内部类实现Listener接口的实例
				// TODO Auto-generated method stub
				B b = new B();
				b.workOfB(1, 2, new Listener() { 	// 这里创建一个匿名内部类实现了Listener接口,
													// 并且实现了Listener的方法,方法内容是
													// 当B完成任务之后 希望执行的代码.
					@Override
					public void finish(int result) {
						// TODO Auto-generated method stub
						resolve(result);
					}

				});
			}
		}).start();
	}

	public void resolve(int x) {
		System.out.println("A我知道答案了:" + x);
	}
}



然后是员工B
public class B {
	Listener listener;

	public void workOfB(int i, int j, Listener listener) {
		
		this.listener = listener;					//员工B首先要取得这个listener接口实现类
		
		try {
			for (int c = 1; c <= 5; c++) {
				Thread.sleep(1000);				//这里线程休眠了一会,模拟B的工作是要时间的
				System.out.println("B思考了" + c + "秒");	
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
		int result = i + j;					//这是工作主体,计算了传进来的i 和 j的和
		listener.finish(result);				//工作完成之后呢,调用接口中的方法,而方法主体记得吗,就是在A中实现的方法.
									//这里为什么可以这么做,我觉得算是JAVA中多态的一种体现,我只管调用这个抽象函数,
									//而抽象函数的具体实现,由A自己来定义
	}
}
最后是我们的测试环节,在主函数Main中测试
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		a.workOfA();
	}

}
<pre name="code" class="java">最终结果::


A遇到问题,赶紧开了个线程交给B
B思考了1秒
B思考了2秒
B思考了3秒
B思考了4秒
B思考了5秒
A我知道答案了:3


 


本人初学者,有什么理解的不好的地方还望大神指出.

也希望更多的JAVA Android学习者一起交流.

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值