Android 接口回调机制详解

时间:2024-04-05 16:42:29

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误。那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理。

一、回调函数

回调函数就是一个通过函数指针调用的函数如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
  JAVA中不允许直接操作指针,那它的回调是如何实现的呢?
  答案:它是通过接口或者内部类来实现的。

JAVA方法回调是功能定义和功能实现分享的一种手段,是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。

 二、接口的定义:

     接口泛指供别人调用的方法或者函数。是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

Java中,定一个接口的形式如下:

  [public] interface InterfaceName {

}

三、接口的特征:  

    接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如privateprotectedstaticfinal等修饰会报编译错误),接口中没有构造方法,不能被实例化,也就是说,接口中的方法必须都是抽象方法。接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量

    一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口,接口必须通过类来实现它的抽象方法.当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类,一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

    要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

class ClassName implements Interface1,Interface2,[....]{

}

  可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

四、接口的用法

1、精简程序结构,免除重复定义

比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。

举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。

下图是分别定义鸟类和昆虫类,其都有飞行的方法。

 下图定义了接口,其类图如下:

 Android 接口回调机制详解

实现代码如下:

 Android 接口回调机制详解

程序运行结果:

Ant can  fly

Ant'slegs  are 6

pigeon  can fly

pigeon  can lay  eggs