Java的接口回调
先上代码: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
上一篇: jquery 轮播图怎么写
下一篇: JS怎么实现简单轮播图特效?(图文详解)