欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java的接口回调

程序员文章站 2022-03-23 17:27:27
...

先上代码:https://git.oschina.net/sfeng95/IntefaceC.git

CDNS下载地址:http://download.csdn.net/detail/sfeng95/9726259

都是免积分的!

场景引入:

我们在编程的时候经常会遇到一些这样的问题,比如说讯飞的语音识别,我们调用它的识别方法之后不是马上就可以得到识别的结果,需要经过一段时间(网络传输耗时),但是我们不会让程序傻逼地等待它的返回结果,而是让classA实现它定义的接口IntefaceC,当讯飞的服务器返回结果了就掉用接口IntefaceC所定义的方法告诉classA,我已经识别完成。下面我们用很简单的Java代码来模拟一下这些场景。

假设1+1=2的计算量非常大,电脑需要十秒钟才能得出结果=2,在这种场景我们的java编程就需要使用接口回调函数。下面我们来一起敲代码,只需要三步。

第一步:创建一个接口,接口定义了一个onfinsh的方法,该方法的参数int jiefajieguo就是用来传输结果的。

 

[java] view plain copy

public interface IntefaceC {  
    void onfinsh(int jiefajieguo);  
}  

第二步:创建一个ClassA,它有一个有参数的构造方法,参数是接口IntefaceC,它有一个做加法的方法:doSomeThing(int a, int b),这个方法用Thread.sleep(10000);来模拟耗时计算,当它把计算完成后就调用接口IntefaceC的onfinsh(c);方法,其中的c就是计算结果,用它来传递计算结果给调用ClassA的doSomeThing的其他类。

 

public class ClassA {  
    IntefaceC intefaceC;  
  
    ClassA(IntefaceC c) {  
        intefaceC = c;  
    }  
  
    public void doSomeThing(int a, int b) {  
        // 模式一些很耗时的操作  
        System.out.println("计算"+a+"+"+b+"大约需要10秒钟时间,请等待");  
        try {  
            Thread.sleep(10000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        int c=a+b;  
        intefaceC.onfinsh(c);  
    }  
  
}  

第三步:定义一个类ClassB ,它实现接口 IntefaceC,同时它需要实现接口定义的onfinsh方法,onfinsh(int jiefajieguo) 其中参数jiefajieguo就是ClassA的返回接口。怎么调用ClassA的doSomeThing方法?

 

首先你要创建一个ClassA对象,它需要一个IntefaceC作为参数,由于ClassB实现了这个接口,所有this就是表示IntefaceC类型的参数。ClassA classA = new ClassA(this);

然后你就可以这样子了classA.doSomeThing(1,2);注意,为什么我没有在main函数中使用它,因为main函数是static的,static方法中不能使用this关键字,使用我只能定义一个方法来调用它。

 

public class ClassB implements IntefaceC {  
  
    public void jiafa(int x,int y) {  
        ClassA classA = new ClassA(this);  
        classA.doSomeThing(x,y);  
    }  
  
    @Override  
    public void onfinsh(int jiefajieguo) {  
        System.out.println("结束:" + jiefajieguo);  
    }  
      
    public static void main(String[] args) {  
        ClassB b=new ClassB();  
        b.jiafa(3,4);  
    }  
  }

上文是我自己的所学所想,有不对的地方轻指出来以免误导大众。我第一次写博客,希望对你们喜欢我的分享。

转载于:https://my.oschina.net/Jevon95/blog/874849