java接口回调的经典使用案例

java接口回调的经典使用案例

内容简介:

  1. 接口回调的理解及需要关注的问题
  2. 接口回调一般常规用法
  3. 接口回调简洁用法
  4. 接口回调的意义

    接口回调简介:

    简单的说接口回调就是:调用者A类访问了被调用者B类中的M方法.这个M方法在执行完毕后又调用了A类中的方法.

问题?

B类中的M方法是如何访问A类中的方法的呢?弄清了这个问题,也就明白了接口回调.

下面我们根据一个场景描述去编写代码:

我们在调用者Caller类中使用被调用者Collee类中的下载文件方法DownLoadFile().下载完成后要通知Caller类文件加载完成.这个时候Caller类才能去访问刚才下载的资源.由于下载需要时间.而Caller类还有其他事情要做.不能等着下载完成后再去做.这样的话下载的方法必须开启新的线程去下载.

接口回调一般常规用法

代码实现:
1.接口和回调方法:

/*
CallBackListener (回调监听接口)
用于回调的接口 (接口内的抽象方法用于监听被调用者返回的结果)
接口中有回调方:该回调方法是被调用者通过回调接口对象去访问调用者的方法.所以形参应该是被调用者返回给调用者结果的数据类型和参数个数。
*/
public interface CallBackListener {
    //发送消息给调用者
    public abstract void sendMessage2Caller(String msg);
}

2.调用者类:

/*
Caller :(调用者)
调用者在访问被调用者的方法前.必须将回调接口对象设置给被调用者.以方便被调用者使用接口回调对象访问自己.
*/
public class Caller {
    public static void main(String[] args) {
        //1.创建被调用者对象
        Callee callee = new Callee();

        //2.创建回调接口对象.
        CallBackListener cb = new CallBackListener() {

            @Override
            public void sendMessage2Caller(String msg) {
                //打印回调传递过来的结果
                System.out.println(msg);

            }
        };

        //3.必须将回调接口对象设置给被调用者
        callee.setCallBackListener(cb);

        //4.访问被调用者的下载文件方法.这个方法完成后被调用者会通过回调接口对象通知我们.
        callee.DownLoadFile();

        System.out.println("你下载真慢,我先去忙别的事了....");
    }
}

3.被调用者类

/*
Callee(被调用者):
1.被调用者类中必须有回调接口类型的变量.
2.并且还要有给该变量赋值的setXxx()方法.
3.在可以给调用者返回结果的时候.拿着接口类型的变量调用接口的方法进行对调用者的访问.(因为接口类型的变量要执行的方法在调用者那里存在).
*/
public class Callee {
    //1.被调用者类中必须有 回调接口类型的变量.
    private CallBackListener cb;

    //2.并且还要有给该变量赋值的setXxx()方法.
    public void setCallBackListener(CallBackListener cb){
        this.cb = cb;
    }

    /**
    * 下载文件是非常耗时的工作.而调用者又需要在下载完成后读取下载的文件.
    * 所以当这个方法完成下载后应该立刻通知调用者.这个通知的动作就称之为回调.
    * @throws InterruptedException
    */
    public void DownLoadFile(){
        //开启新的线程去下载.异步任务.
        new Thread(){
            public void run() {
                long start = System.currentTimeMillis();

                //使用睡眠模拟耗时工作.
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                long end = System.currentTimeMillis();

                //完成下载后通知调用者
                if(cb != null){
                    cb.sendMessage2Caller("下载完成,耗时:"+(end-start)/1000+"秒,你可以去访问资源了.");
                }
            };
        }.start();
    }
}

运行结果如下:

5秒钟后

接口回调简洁用法

代码实现:

1.接口和回调方法:

/*
CallBackListener (回调监听接口)
用于回调的接口 (接口内的抽象方法用于监听被调用者返回的结果)
接口中有回调方:该回调方法是被调用者通过回调接口对象去访问调用者的方法.所以形参应该是被调用者返回给调用者结果的数据类型和参数个数。
*/
public interface CallBackListener {
    //发送消息给调用者
    public abstract void sendMessage2Caller(String msg);
}

2.调用者类:

public class Caller {
    public static void main(String[] args) {
        //1.创建被调用者对象
        Callee callee = new Callee();
        //2.访问被调用者的下载文件方法.这个方法完成后被调用者会通过回调接口对象通知我们.
        //使用匿名内部类对象当做参数传递.更加简洁
        callee.DownLoadFile(new CallBackListener() {

            @Override
            public void sendMessage2Caller(String msg) {
                //打印回调传递过来的结果
                System.out.println(msg);
            }
        });

        System.out.println("你下载真慢,我先去忙别的事了....");
    }
}

3.被调用者类

/**
* 下载文件是非常耗时的工作.而调用者又需要在下载完成后读取下载的文件.
* 所以当这个方法完成下载后应该立刻通知调用者.这个通知的动作就称之为回调.
* final CallBackListener cb 匿名内部类访问局部变量必须加final.
*/
public class Callee {
    public void DownLoadFile(final CallBackListener cb){
        //开启新的线程去下载.异步任务.
        new Thread(){
            public void run() {
                long start = System.currentTimeMillis();

                //使用睡眠模拟耗时工作.
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                long end = System.currentTimeMillis();

                //完成下载后通知调用者
                if(cb != null){
                    cb.sendMessage2Caller("下载完成,耗时:"+(end-start)/1000+"秒,你可以去访问资源了.");
                }

            };
        }.start();
    }
}

接口回调的意义:

通过以上两个案例大家会不会有一个疑问.为什么要搞一个接口呢?把接口换成普通的类可以吗?
当然是可以的.这里之所以使用接口回调.是因为接口具有规范性和灵活性.特别是规范性.

代码举例:

1.原来的接口换成抽象类其他两个类不变, 不会影响运行效果

public abstract class CallBackListener {
    //发送消息给调用者
    public abstract void sendMessage2Caller(String msg);
}

2.原来的接口换成类其他两个类不变, 不会影响运行效果

public class CallBackListener {
    //发送消息给调用者
    public void sendMessage2Caller(String msg){

    };
}

原文地址:https://blog.51cto.com/14473726/2433912

时间: 2024-11-05 23:29:42

java接口回调的经典使用案例的相关文章

Java接口回调实现按钮监听

做Android开发的时候,经常碰到View的事件监听,虽然一直在用,但从未思考它的实现原理.还有回调函数虽然经常听说,但是总感觉很晕,一想脑袋就开始乱了.所以今天就写点东西来理一下思路. 回调函数 以下是维基百科上的定义: 在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 光看定义可能晦涩难懂,下面还是回到标题,用

Java接口回调

public class A { private D d; private C c; public A (C c) { this.c = c; } public void setD (D d) { this.d = d; } ... public interface B { public void aa(); public void bb(); public void cc(); } } public class C { private A a = null; ... protected voi

回调函数、Java接口回调 总结

回调函数 谈到回调,我们得先从回调函数说起,什么叫回调函数呢? 回调函数是什么?    百度百科的解释:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应.    接着,我们从下图简单说明一下回调函数.    已知图形上面三种模块,此时标号2能称为回调函数吗? 答案:不能,只有当标号2函

Java接口回调机制

一.前言 最近在看android Fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用.异步调用和回调.同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B

java 接口回调

学习自:http://blog.csdn.net/xiaanming/article/details/8703708/ http://hellosure.iteye.com/blog/1130176 内容and评论都很精彩,现在只是学习了概念,以后在用到还需要继续研究. A类实现一个接口,接口中有回调方法f,类B有方法fun(),类A对象a有类B对象的引用b,a调用b的方法fun(),在这个方法fun()中又调用了a实现的接口里的方法f. 在安卓中,线程run方法就是一个回调方法,start之后

Android(java)回调函数经典示例

回调函数经典示例 1.使用java回调函数来实现一个测试函数运行时间的工具类 public class TestObject { /** * 一个用来被测试的方法,进行了一个比较耗时的循环 */ public static void testMethod(){ for ( int i= 0 ; i< 100000000 ; i++){ } } /** * 一个简单的测试方法执行时间的方法 */ public void testTime(){ long begin = System.current

Java中的接口回调

接口回调是多态的另一种体现.接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法.当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,成为接口回调.不同的类在使用同一接口时,可能具有不同的功能体现.即接口的方法体不必相同,因此接口回调可能产生不同的行为. 接口回调会方便功能的扩展,在主功能外由框架层实现定制功能处理. 现在有两个类,一个是A,一个是B,回调就是A去调用B中的某个方法,然后B又回调A中

java 接口的回调

Example6_3.java interface ShowMessage { void 显示商标(String s); } class TV implements ShowMessage { public void 显示商标(String s) { System.out.println(s); } } class PC implements ShowMessage { public void 显示商标(String s) { System.out.println(s); } } public

java基础接口回调的实现

//接口回调理解:先创建好接口,需要使用的时候用匿名内部类实现接口,就叫接口回调,以下是我设计的程序. package callback; import java.util.ArrayList; import java.util.List; import java.util.Scanner; //接口 package callback; public interface CallPhone { public void playPhone(); } //PhoneNum类 package call