<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、基本定义:</span>
1)接口: interface 通过implement拓展类,实现类的继承,类之间的松耦合,规定一定的标准规范。就像USB
2)接口实现:简单理解,可以说是重写接口中的空方法,利用这点在其拓展的类中,可以利用空方法的参数,来标准化可以重写实现的功能。一用以回调
3)匿名类:没有引用的类,唯一一个没有构造器的类。在事件监听中,与接口一起使用,大大简化代码。试想接口是不能直接new实例化的,每次实现接口都要定义一个类是一件很没效率的事情。
4)回调函数:这里引用一个很经典的情景:
客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
二、android里中的理解:
1)
首先先看看api中关于setOnClickListener,button,OnclickListener的定义:
<pre name="code" class="java"> public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
</pre><pre name="code" class="java"><pre name="code" class="html"> a.定义接口
public interface OnClickListener {
public void OnClick(Button b);
b. 定义Button
public class Button {
OnClickListener listener;
public void click() {
listener.OnClick(this);
}
public void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
}
</pre><pre name="code" class="java">
我们看看第一种最常用的button的click事件监听:
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
button的setOnClickListener方法实现的就是为button监听到click事件后的回调,绑定一个接口标准,可以理解为规定 响应click一定要用接口来实现,然后重写click方法。这里的button是被问的一方,在问题(click)悬而未决时,不做动作,当条件满足后根据OnClickListener(电话)来回调方法onclick,因为onclick随着接口OnClickListener已是button的成员。这里已经是一种异步操作。
某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
</pre>2)匿名类,接口实现:<p></p><p></p><pre name="code" class="java"> button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
在这里
OnClickListener
是一个匿名类,操作 ,因为接口无法new,所以其实这里省略了view,完整是view.onclicklistener 所以说是通过onclicklistener 拓展view类,来实现接口中的方法。
补充其外button两种写法:
1.
btnTakeVideo.setOnClickListener(btnonclicklistener);
private OnClickListener btnonclicklistener = new OnClickListener() {
@Override
public void onClick(View v) {
这里也是利用匿名类实现一个onclicklistener接口
2.
button.setOnClickListener(this);
<pre name="code" class="html">public class MainActivity extends Activity implements OnClickListener {
@Override
public void onClick(View v) {
这里通过类mainactivity实现接口
回调机制:A有a,B有b,A调用本身a,通过B中的方法调用本身的a,这时如果AB中共享同一个接口,这个接口实现可以重写a,那么类之间实现了松耦合。回调函数也就有很大的意义!!