通过android中的button理解接口,接口实现,匿名类,回调事件等面对对象思想

<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,那么类之间实现了松耦合。回调函数也就有很大的意义!!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值