zoukankan      html  css  js  c++  java
  • 接口回调的例子和安卓中的接口回掉实例

    Callback 接口
    public interface CallBack {
        public void solve(String result);
    }
    A类
    public class Me implements CallBack {
            private You you;   
      
        /** 
         * 我的构造方法,持有你的引用 
         * @param you 
         */  
        public Wang(You you){  
            this.you =you;  
        }  
        public void hasQuestion(final String question) {
             new Thread(new Runnable() {  
                @Override  
                public void run() {  
                    /** 
                     * 我调用你中的方法,在这里注册回调接口 
                     * 这就相当于A类调用B的方法C 
                     */  
                    You.executeMessage(Wang.this, question);   
                }  
            }).start();  
              
            //我问完问题挂掉电话就去干其他的事情了,诳街去了  
            play();  
        }  
      
        public void play(){  
            System.out.println("我要逛街去了");  
        }  
        }

        /**

           * 你知道答案后调用此方法告诉我,就是所谓的我的回调方法 

          */  

    
        @Override
        public void solve(String result) {//实现接口中的抽象方法
            // TODO Auto-generated method stub
            System.out.println(result); 
    }

    }
    B类
    /**
    * 这个就是你 * @author hjw * */ public class You{ /** * 相当于B类有参数为CallBack callBack的f()---->背景三 * @param callBack * @param question 我问的问题 */ public void executeMessage(CallBack callBack, String question){ System.out.println("我问的问题--->" + question); //模拟你办自己的事情需要很长时间 for(int i=0; i<10000;i++){ } /** * 你办完自己的事情之后想到了答案是2 */ String result = "答案是2"; /** * 于是就打电话告诉我,调用我中的方法 * 这就相当于B类反过来调用A的方法D */ callBack.solve(result); } }

    根据这个例子,我自己的总结就是,A类实现了Callback接口的solve抽象方法(也就是回调方法),B类在自己的一个方法中(executeMessage())调用A类的实现的抽象方法(solve())。最后,也是最重要的一步,接口回调,A类调用B类的executeMessage()方法,因为B类中调用了A类的实现的solve抽象方法(也就是回调方法),当A类调用B类时,也就调用了solve回调方法,也就是实现了接口回调。

    下面是android中一个简单的接口回调例子

    //这个是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);  
    }  
    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;  
      
    /** 
     * 这个就相当于Class A 
     * @author xiaanming 
     * 实现了 OnClickListener接口---->背景一 
     */  
    public class MainActivity extends Activity implements OnClickListener{  
        /** 
         * Class A 包含Class B的引用----->背景二 
         */  
        private Button button;  
      
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            button = (Button)findViewById(R.id.button1);  
              
            /** 
             * Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C 
             */  
            button.setOnClickListener(this);  
        }  
      
        /** 
         * 用户点击Button时调用的回调函数,你可以做你要做的事 
         * 这里我做的是用Toast提示OnClick 
         */  
        @Override  
        public void onClick(View v) {  
            Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();  
        }  
      
    }  
    /** 
     * 这个View就相当于B类 
     * @author hjw
     * 
     */  
    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接口------>背景三 
         * 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);  
                  
                //这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法咯  
                mOnClickListener.onClick(this);  
                return true;  
            }  
      
            return false;  
        }  
    }  

    此处 View方法可能有些困惑,应为在MainActivity中(A类)中回掉的setOnclickListener方法,但是该方法却并没有调用A类实现接口抽象方法onClick()方法,A类实现接口抽象方法onClick()方法在performClick()方法调用。这个问题,我当时百思不得其解,直到我搜索了一下performClick()方法,见如下

    先看看performClick()源码:
    
    public boolean performClick() {
            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
     
            if (mOnClickListener != null) {
                playSoundEffect(SoundEffectConstants.CLICK);
                mOnClickListener.onClick(this);
                return true;
            }
     
            return false;
        }
    由源码可以看出,只要是使用了view.setOnClickListener()方法设置监听器,就会自动触发view.performClick()。由此就可以解释A类是如何回掉onClick方法的!

    以上代码参考自博客http://blog.csdn.net/xiaanming/article/details/8703708/和http://blog.sina.com.cn/s/blog_70ae1d7b0102v7uk.html

    善守者藏于九地之下, 善攻者动于九天之上
  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/jiutiankunpeng/p/5477827.html
Copyright © 2011-2022 走看看