Java的接口回调

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sfeng95/article/details/53957322

先上代码: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就是用来传输结果的。

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);
	}

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





猜你喜欢

转载自blog.csdn.net/sfeng95/article/details/53957322