android开发之回调方法的一种设计

来源:互联网 发布:windows xp开机音乐 编辑:程序博客网 时间:2024/06/04 18:24

回调: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 backcallBackInterface.beforeCallBack();callBackInterface.callBack(map);}}


2.下面这个类是功能的实现

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() {@Overridepublic void callBack(Map<String, String> map) {// 实现在父类中定义的接口类中未实现的方法System.out.println("拿到父类中传递过来的map" + map);// 接下来写自己的逻辑代码,Parent类中能调用自己接下来的的逻辑// ...业务逻辑}@Overridepublic void beforeCallBack() {// 实现在父类中定义的接口类中未实现的方法// 接下来写自己的逻辑代码,Parent类中能调用自己接下来的的逻辑// ...业务逻辑}}).start(); // .start()方法相当于If you call me}// 测试方法public static void main(String[] args) {callParent();}}

3.测试结果

拿到父类中传递过来的map{name=skythinking}

4.另外一种实现回调的方式,可以参考:http://blog.csdn.net/aigestudio/article/details/40869893

二.有了上面的思想,我们就可以模仿实现android的点击事件了

实质:持有实现类的引用,调用实现类实现的在接口中定义的方法就完成了接口的回调设计

1.定义一个点击事件的接口

  1. //这个是View的一个回调接口  
  2. /** 
  3.  * Interface definition for a callback to be invoked when a view is clicked. 
  4.  */  
  5. public interface OnClickListener {  
  6.     /** 
  7.      * Called when a view has been clicked. 
  8.      * 
  9.      * @param v The view that was clicked. 
  10.      */  
  11.     void onClick(View v);  


2.在Activity中实现这个接口,实现接口当然也就需要实现OnClickListener接口中定义的onClick(View v)方法


  1. package com.example.demo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. import android.widget.Toast;  
  9.   
  10. /** 
  11.  * 
  12.  * 实现 OnClickListener接口
  13.  */  
  14. public class MainActivity extends Activity implements OnClickListener{  
  15.    
  16.     private Button button;  
  17.   
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.         button = (Button)findViewById(R.id.button1);  
  23.           
  24.         /** 
  25.          * button注册点击事件,即通过该方法,把该实现类的引用赋值给
  26.          */  
  27.         button.setOnClickListener(this);  
  28.     }  
  29.   
  30.     /** 
  31.      * 用户点击Button时调用的回调函数, 
  32.      * 可以做任何你想做的事
  33.      */  
  34.     @Override  
  35.     public void onClick(View v) {  
  36.         //想做的事
  37.     }  
  38.   
  39. }  


3.在View类中通过setOnClickListener(OnClickListener l)拿到实现类的引用,然后就可以调用实现类的onClick(View v)方法了

  1. public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {  
  2.     /** 
  3.      * Listener used to dispatch click events. 
  4.      * This field should be made private, so it is hidden from the SDK. 
  5.      * {@hide} 
  6.      */  
  7.     protected OnClickListener mOnClickListener;  
  8.       
  9.     /** 
  10.      * 通过setOnClickListener(OnClickListener l)来拿到实现类的引用
  11.      * Register a callback to be invoked when this view is clicked. If this view is not 
  12.      * clickable, it becomes clickable. 
  13.      * 
  14.      * @param l The callback that will run 
  15.      * 
  16.      * @see #setClickable(boolean) 
  17.      */  
  18.       
  19.     public void setOnClickListener(OnClickListener l) {  
  20.         if (!isClickable()) {  
  21.             setClickable(true);  
  22.         }  
  23.         mOnClickListener = l;  
  24.     }  
  25.       
  26.       
  27.     /** 
  28.      * Call this view's OnClickListener, if it is defined. 
  29.      * 
  30.      * @return True there was an assigned OnClickListener that was called, false 
  31.      *         otherwise is returned. 
  32.      */  
  33.     public boolean performClick() {  
  34.         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);  
  35.   
  36.         if (mOnClickListener != null) {  
  37.             playSoundEffect(SoundEffectConstants.CLICK);  
  38.               
  39.             //拿到实现类的引用(mOnClickListener)就可以调用实现类的onClick(View v)方法了,并且把View类的引用传递给了实现类  
  40.             mOnClickListener.onClick(this);  
  41.             return true;  
  42.         }  
  43.   
  44.         return false;  
  45.     }  
  46. }  


0 0