版权声明:本文为博主原创文章,未经博主允许不得转载。 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。
原创转载时候请注明转载出处.