您的位置:首页 > 编程语言 > Java开发

Java的接口回调

2017-04-07 00:00 281 查看
先上代码: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);
}
}

上文是我自己的所学所想,有不对的地方轻指出来以免误导大众。我第一次写博客,希望对你们喜欢我的分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java接口回调