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

来源:互联网 发布:手机淘宝咋退货退款 编辑:程序博客网 时间:2024/06/07 04:11

第一篇博客,献给我的舍友逼哥 @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 stubB b = new B();b.workOfB(1, 2, new Listener() { // 这里创建一个匿名内部类实现了Listener接口,// 并且实现了Listener的方法,方法内容是// 当B完成任务之后 希望执行的代码.@Overridepublic void finish(int result) {// TODO Auto-generated method stubresolve(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 blocke.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 stubA a = new A();a.workOfA();}}
<pre name="code" class="java">最终结果::
A遇到问题,赶紧开了个线程交给BB思考了1秒B思考了2秒B思考了3秒B思考了4秒B思考了5秒A我知道答案了:3




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

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

1 0
原创粉丝点击