Android的回调

1、什么是回调?
百度百科的解释:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

其实很多地方都有个通俗的说法来描述回调:
“场景:小明问妈妈什么时候开饭,妈妈说还要一会儿;小明说那我先去忙其他的,饭好了,电话叫我“;
在这个场景中:电话就是那个函数的指针,指向的是小明;特定的条件就是饭做好了;小明跟妈妈说饭好了,电话叫我,这个是将指针注册到妈妈的函数里;这里隐藏的回调函数就是小明吃饭这个函数,实现方是小明,而调用方是妈妈;

然而Android(Java语言没有指针的概念)没有指针的概念,在Andrioid中使用接口来替代表示指针的概念;最为普遍的例子就是Button的点击事件;

2、回调的实例
回调的实例一:
Button的点击事件:
首先我们知道Button是继承至View控件的;然后android对于View的触摸、点击等手势事件它的一套处理机制(后续有时间研究一下):
首先是Mainctivity:

public class MainActivity extends Activity implements OnClickListener {

    Button btn_callback;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_callback = (Button) findViewById(R.id.btn);

        //注册回调
        btn_callback.setOnClickListener(this);

    }

    //实现实现回调函数
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId()){
            case R.id.btn:
                Toast.makeText(getApplicationContext(), "this is callback", Toast.LENGTH_LONG).show();
                break;
            default:
                break;          
        }




    }
}

然后是View源码位置为:/base/core/java/android/view/view.java;

 //接口对象
 public OnClickListener mOnClickListener;
 ... ...
 //注册函数
 public void setOnClickListener(OnClickListener l) {
           if (!isClickable()) {
             setClickable(true);
          }
         getListenerInfo().mOnClickListener = l;
     }

//接口定义
public interface OnClickListener {
       /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

  //满足条件进行调用,这里是view对触控事件的处理逻辑

/**
   * Call this view's OnClickListener, if it is defined.  Performs all normal
      * actions associated with clicking: reporting accessibility event, playing
      * a sound, etc.
      *
      * @return True there was an assigned OnClickListener that was called, false
      *         otherwise is returned.
      */
     public boolean performClick() {
         final boolean result;
         final ListenerInfo li = mListenerInfo;
         if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
             li.mOnClickListener.onClick(this);
             result = true;
         } else {
             result = false;
         }

         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
         return result;
     }

     /**
      * Directly call any attached OnClickListener.  Unlike {@link #performClick()},
      * this only calls the listener, and does not do any associated clicking
      * actions like reporting an accessibility event.
      *
      * @return True there was an assigned OnClickListener that was called, false
      *         otherwise is returned.
      */
     public boolean callOnClick() {
         ListenerInfo li = mListenerInfo;
         if (li != null && li.mOnClickListener != null) {
             li.mOnClickListener.onClick(this);
             return true;
         }
         return false;
     }

上面我们可看成MainActivity中进行回调函数的注册及实现;View中是定义回调函数及调用回调函数。

三、一些总结
回调的用处:用于处理一些待处理的事件,我的理解是:A需要处理事情1,然而事情1还需要其他的工作的铺垫;那么我们就可以将处理铺垫的工作让B去处理,等B处理好了再通知A去做事情1;而在此期间A可以去处理其他事情不至于完全阻塞在事情1上;个人感觉有种异步处理的意味。
看到有的论坛谈论到此策略是观察者模式,有对设计模式熟悉的读者可以一同交流。
Android中的回调多见于处理手势,点击等事件,当然还有很多地方有用到,欢迎大家提出来一起讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值