详解java的回掉函数与接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33883389/article/details/78669486

     相信很多人都是听一些大牛说,用回调函数,接口,听起来是挺高大上的,我去这个东西是什么呀?很多人去找网上的官方的帖子,然后看了半天还是一脸蒙蔽,什么都没学会。所谓回调:就是一个类要调用另一个类的方法,当另一个类的方法执行完毕的时候反过来调用了上一个类的方法。而且,回调经常本使用到线程中,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() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				xiaoHua.Message(XiaoMing.this, ask);
			}
		}).start();
		//小明才不会闲着蛋疼的等小花回复,于是去耍了两把Cf
		playCf();
	}
	
	
	public void playCf() {
		 System.out.println("穿越火线真好玩!");  
	}
	/**
	 * 这里就是回调回来的东西
	 * 小花通过这个方法告诉小明我们可以去吃饭了
	 * @param result
	 */
	@Override
	public 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() {
			
			@Override
			public 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。

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

猜你喜欢

转载自blog.csdn.net/qq_33883389/article/details/78669486