详解java的回掉函数与接口

来源:互联网 发布:js保存数据到本地文件 编辑:程序博客网 时间:2024/06/11 06:29

 

     相信很多人都是听一些大牛说,用回调函数,接口,听起来是挺高大上的,我去这个东西是什么呀?很多人去找网上的官方的帖子,然后看了半天还是一脸蒙蔽,什么都没学会。所谓回调:就是一个类要调用另一个类的方法,当另一个类的方法执行完毕的时候反过来调用了上一个类的方法。而且,回调经常本使用到线程中,java的线程确实很复杂,这里就以回调来简单提一下,是不是还是有点拗口,下面举个例子就可以清楚的表述了。

     相信很多大学码农的女朋友都是键盘和鼠标,可是‘小明’作为武汉科技大学打学霸的他缺有着一个美若天仙的妹子名叫‘小花’,小明和小花感情非常的好,有一天,小明想约小花出去吃饭,这是小花就想小明想干嘛,大晚上的,我得好好打扮一番,就和小明说等捣腾两下在给你打电话,小明不仅是学霸,而且玩穿越火线也很牛,他肯定不是闲着蛋疼的等小花,于是就开始玩起了穿越火线。小花捣腾了半个小时后给小明打电话说出去吃饭吧,我捣腾好了。

    上面这个例子已经很充分的体现了回调的含义了,下面举3个例子来详解回调(后面2个是android的小demo)

package callback;/** * 定义了一个回调接口 * @author 年少 * */public interface CallBack {   /**      * 这个是小花打扮完了通过这个方法来告诉小明,就是回调函数     * @param result 是答案      */ public void Answer(String result);}
package callback;/** * 小明,实现了回调接口 * @author nianshao * */public class XiaoMing implements CallBack {//定义了小明的女朋友private XiaoHua xiaoHua ;/** *实现女朋友 * @param xiaoHua */public XiaoMing(XiaoHua xiaoHua) {this.xiaoHua = xiaoHua;}/** * 小明通过这个方法问小花能否一起吃个饭  * @param ask 问 */public void canEatTogether(String ask) {//这里模范两人对话过程,相当于一个耗时操作,即开启一个线程new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubxiaoHua.Message(XiaoMing.this, ask);}}).start();//小明才不会闲着蛋疼的等小花回复,于是去耍了两把CfplayCf();}public void playCf() { System.out.println("穿越火线真好玩!");  }/** * 这里就是回调回来的东西 * 小花通过这个方法告诉小明我们可以去吃饭了 * @param result */@Overridepublic void Answer(String result) { System.out.println("小花告诉小明的回复是--->" + result);  }}

package callback;/** * 这个是小花 * @author meng * */public class XiaoHua {public void Message(CallBack callBack,String ask) { System.out.println( ask);  //小明用睡眠来模拟小花捣腾了大半个小时 new Thread(new Runnable() {@Overridepublic void run() {//小花捣腾好了String result = "我捣腾了,我们去吃饭吧";/** * 准备给小明打电话,说我们可以去吃饭了 * 这里就开始回调回去了 */callBack.Answer(result);}}).start();}}
     看完了这块代码是不是觉得一下子就理解了回调的含义,上面是个异步回调,与之相对的就是同步回调了,下面就以android的点击事情做详解同步回调.(android 基于java)

    所谓通步回调,就是触发就立马回调,这里很容易联想起来,android点击事情,其实现 原理莫过于回调机制,

现在来分析分析下Android View的点击方法onclick();我们知道onclick()是一个回调方法,当用户点击View就执行这个方法,我们用Button来举例好了

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


 public void setOnClickListener(@Nullable OnClickListener l) {        if (!isClickable()) {            setClickable(true);        }        getListenerInfo().mOnClickListener = l;    } /**     * 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;    }

package com.union.test.myapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;public class Main2Activity extends AppCompatActivity implements View.OnClickListener {    private Button btn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        btn = (Button) findViewById(R.id.btn);        btn.setOnClickListener(this);    }    @Override    public void onClick(View v) {            }}
     这里实现逻辑就非常简单了,在MainActivity中实现了点击事件回调的接口OnclikLister,定义了一个Button,并且给他注册了点击事件,当按钮点击的时候去调用view底下的 performClick()这个方法,然后完成之后回调给MainActivity的onClick()方法中。

  是不是看了上面的代码,解决了一直很迷糊的东西.在这里希望你能点个关注,坚持更新学习体会博客.深入学习,分享java。

   原创转载时候请注明转载出处.