解析接口回调

来源:互联网 发布:excel如何做数据透视表 编辑:程序博客网 时间:2024/04/28 08:31

重要性:

接口回调在Android中是非常常见的一种“设计模式”,比如OnClickListener OnTouchListener等等,甚至Acticity的生命周期也是使用接口回调的。

尤其是在对一些View进行封装的时候,接口模式尤其重要。所以,想学习好Android,接口回调不得不学。

之前看过一些人使用接口回调,总对其中的逻辑想不明白,后来再仔细地看了一下才明白接口回调的原理和重要性。

使用情形:

一般来说在我们不知道程序什么时候返回结果,但我们又想在程序执行完毕返回结果的情形下就可以考虑使用接口回调。

通常我们要调用一个方法,当它处理完毕后会达到return,在这里我们可以获取返回值。

<span style="white-space:pre"></span>int i = 0;public int start(){<pre name="code" class="java" style="font-size: 13.3333px;"><span style="white-space:pre"></span>i++;
return i;}

但是如果方法中有线程呢?而且诸如上面的i++放在线程中执行,会怎么样呢?比如:

<span style="white-space:pre"></span>int i = 0;public int start(){new Thread(new Runnable(){@Overridepublic void run() {<pre name="code" class="java" style="font-size: 13.3333px;"><span style="white-space:pre">Thread.sleep(3000);</span>// 为了使程序看起来更清晰,没有使用try...catch结构
<span style="white-space:pre"></span>i++;
}).start();return i;}

进入了start方法之后开启了线程,这时候程序立刻到了return处,而线程仍处于sleep状态,返回的结果是i。如果我们希望i++之后再返回结果,该怎么做呢?——接口回调。

上面代码的接口回调处理:

首先是一个类Class02

public class Class02 {int i = 0;public int start(){new Thread(new Runnable(){@Overridepublic void run() {try {Thread.sleep(3000);i++;if(callback != null){ //当接口不为空的时候就调用接口callback.onCall(i); }} catch (InterruptedException e) {e.printStackTrace();}}}).start();return i;}public static interface Callback{ //自定义一个接口public void onCall(int i);}private Callback callback;//创建一个接口实例public void setCallback(Callback callback2){ //定义一个绑定接口的方法this.callback = callback2;}}
然后在主程序中使用接口回调的方式是(这里还是做了一个小小的对比,用来验证上面的分析)

public class Class01 {public static void main(String[] args){// 一般如果没有线程的话,直接调用方法获取它的return值即可Class02 cls02 = new Class02();System.out.println(cls02.start());// 如果有线程的话,使用接口回调cls02.setCallback(new Class02.Callback(){@Overridepublic void onCall(int i) {System.out.println(i);}});}}
输出结果是

0
1
上面就是接口回调的一般模式,实际上笔者认为接口回调就相当于将一个部分的代码放在了另一个代码中执行,比如上面的代码中线程中的那部分就相当于:

public int start(){new Thread(new Runnable(){@Overridepublic void run() {try {Thread.sleep(3000);i++;if(callback != null){<pre name="code" class="java" style="font-size: 13.3333px;"><span style="white-space:pre"></span>System.out.println(i);//这里!也就是将onCall中的方法放在这里来执行了<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"> </span>
}} catch (InterruptedException e) {e.printStackTrace();}}}).start();return i;}

总评:

1.接口回调的用途是相当广的,而且有了这个设计方式,你可以将很多代码封装成代码块,原本很长的代码只要设置一个接口回调就可以了。

2.接口回调用于一个想要完成的操作不确定什么时候完成的情形,比如单击事件、线程等。

3.接口回调的使用步骤:

Step1: 创建接口public static interface InterfaceName{ void method(){ ...  }  }

Step2: 创建一个接口实例private InterfaceName interfaceName;

Step3: 创建一个绑定接口的方法public void setOn....Listener(InterfaceName interfaceName){ this.interfaceName = interfaceName; }

Step4: 在需要返回结果的地方的代码执行完毕的地方调用接口 interfaceName.method(); (注意判断是否为null)

Step5: 在其他程序中使用的时候调用setOn...Listener方法,然后将一个InterfaceName的实例在method中写入要指定的程序即可。






0 0
原创粉丝点击