回调:If you call me,I will call you back! //如果你调用了我,我将会反过来调用你,这就是回调
回调在android编程中很常见,比如button的点击事件.
既然回调这么常见,那么回调有啥好处捏?为啥要这样设计?这才是我们需要关心的,编程的世界里,思想比实现显得更为重要.言归正传,回调实现了功能的定义和功能的实现相分离的设计实现,是一种松耦合的体现.
实质:持有实现类的引用,调用实现类实现的在接口中定义的方法就完成了接口的回调设计
一.1种回调的实现
1.下面这个类是功能的定义
package com.skythinking.callback;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author skythinking
* @return
* 回调的好处:父类可以调用子类的方法处理逻辑,而作为父类,不用关心子类如何实现,android框架中就用了好多回调,比如Activity的onCreate
* ()等方法就是回调的运用
*
*/
public class Parent {
// 2.定义一个接口类的实现类引用
CallBackInterface callBackInterface;
// 1.定义一个接口类
public interface CallBackInterface {
// 在调用CallBack()方法之前调用的方法
public void beforeCallBack();
// 回调方法
public void callBack(Map<String, String> map); // 父类可以传递给子类处理,可以返回处理结果,也可以不返回结果,这个看自己的需求
}
// 3.利用构造器拿到接口类的实现类引用
public Parent(CallBackInterface callBackInterface) {
this.callBackInterface = callBackInterface;
}
public void start() {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "skythinking");
// .beforeCllBack(),.callBack(map)方法相当于 I will call you back
callBackInterface.beforeCallBack();
callBackInterface.callBack(map);
}
}
package com.skythinking.callback;
import java.util.Map;
import com.skythinking.callback.Parent.CallBackInterface;
public class Son {
public static void callParent() {
new Parent(new CallBackInterface() {
@Override
public void callBack(Map<String, String> map) {
// 实现在父类中定义的接口类中未实现的方法
System.out.println("拿到父类中传递过来的map" + map);
// 接下来写自己的逻辑代码,Parent类中能调用自己接下来的的逻辑
// ...业务逻辑
}
@Override
public void beforeCallBack() {
// 实现在父类中定义的接口类中未实现的方法
// 接下来写自己的逻辑代码,Parent类中能调用自己接下来的的逻辑
// ...业务逻辑
}
}).start(); // .start()方法相当于If you call me
}
// 测试方法
public static void main(String[] args) {
callParent();
}
}
3.测试结果
拿到父类中传递过来的map{name=skythinking}
4.另外一种实现回调的方式,可以参考: http://blog.youkuaiyun.com/aigestudio/article/details/40869893
二.有了上面的思想,我们就可以模仿实现android的点击事件了
实质:持有实现类的引用,调用实现类实现的在接口中定义的方法就完成了接口的回调设计
1.定义一个点击事件的接口
- //这个是View的一个回调接口
- /**
- * Interface definition for a callback to be invoked when a view is clicked.
- */
- public interface OnClickListener {
- /**
- * Called when a view has been clicked.
- *
- * @param v The view that was clicked.
- */
- void onClick(View v);
- }
2.在Activity中实现这个接口,实现接口当然也就需要实现OnClickListener接口中定义的onClick(View v)方法
- package com.example.demo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- /**
- *
- * 实现 OnClickListener接口
- */
- public class MainActivity extends Activity implements OnClickListener{
- private Button button;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button1);
- /**
- * button注册点击事件,即通过该方法,把该实现类的引用赋值给
- */
- button.setOnClickListener(this);
- }
- /**
- * 用户点击Button时调用的回调函数,
- * 可以做任何你想做的事
- */
- @Override
- public void onClick(View v) {
- //想做的事
- }
- }
3.在View类中通过setOnClickListener(OnClickListener l)拿到实现类的引用,然后就可以调用实现类的onClick(View v)方法了
- public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
- /**
- * Listener used to dispatch click events.
- * This field should be made private, so it is hidden from the SDK.
- * {@hide}
- */
- protected OnClickListener mOnClickListener;
- /**
- * 通过setOnClickListener(OnClickListener l)来拿到实现类的引用
- * Register a callback to be invoked when this view is clicked. If this view is not
- * clickable, it becomes clickable.
- *
- * @param l The callback that will run
- *
- * @see #setClickable(boolean)
- */
- public void setOnClickListener(OnClickListener l) {
- if (!isClickable()) {
- setClickable(true);
- }
- mOnClickListener = l;
- }
- /**
- * Call this view's OnClickListener, if it is defined.
- *
- * @return True there was an assigned OnClickListener that was called, false
- * otherwise is returned.
- */
- public boolean performClick() {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
- if (mOnClickListener != null) {
- playSoundEffect(SoundEffectConstants.CLICK);
- //拿到实现类的引用(mOnClickListener)就可以调用实现类的onClick(View v)方法了,并且把View类的引用传递给了实现类
- mOnClickListener.onClick(this);
- return true;
- }
- return false;
- }
- }