• 为你的程序添加监听器


    平时在写程序时经常会遇到监听器,比如按钮的click监听器,按键监听器等等。而android中的监听器和java中的回调函数是同一个概念,都是在底层代码中定义一个接口来调用高层的代码。那么什么是回调函数呢?网上说的是“在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。”按照我的理解就是在程序A中先挖了一个坑,然后等着你在程序B中去填里面的内容。不填?那就是被坑咯~

    一、定义回调函数

    1. 建立一个类,其中包括一个接口的变量
      private CallBack callBack;//接口的变量
    2. 建立一个接口的声明
      public interface CallBack{
         public void Out();//接口里面要实现的方法
      }
    3. 在类中与接口绑定(或者说获得接口的引用)
      复制代码
      public void setCallBack(CallBack callBack){
              this.callBack = callBack;
          }
          
          public void Out(){
              callBack.Out();
              System.out.println("这是CallerClass的输出");
          }
      复制代码
    4. 整个类
      复制代码
      public class CallerClass {
          
          private CallBack callBack;//接口的声明
          
          public CallerClass(){};
          
          public void setCallBack(CallBack callBack){
              this.callBack = callBack;
          }
          
          public void Out(){
              callBack.Out();
              System.out.println("这是CallerClass的输出");
          }
          
          public interface CallBack{
              public void Out();//接口里面要实现的方法
          }
          
      }
      复制代码

    二、调用回调函数

    我这里是在Activity中绑定接口,实际代码如下:

    public class MainActivity extends Activity implements CallerClass.CallBack{  private CallerClass caller; ...}

    继承了CallerClass中的CallBack接口,Out方法如下:

        @Override
        public void Out() {
            // TODO Auto-generated method stub
            System.out.println("这是Activity上的输出");
        }

    最后在onCreate中调用CallerClass的Out()方法:

    caller = new CallerClass();
    caller.setCallBack(this);
    caller.Out();

    完整代码:

    复制代码
    public class MainActivity extends Activity implements CallerClass.CallBack{
        
        private CallerClass caller;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            caller = new CallerClass();
            caller.setCallBack(this);
            caller.Out();
            
        }
    
        @Override
        public void Out() {
            // TODO Auto-generated method stub
            System.out.println("这是Activity上的输出");
        }
    
    }
    复制代码

    三、结果

    Perfect~

    interface的作用感觉和C++中的指针差不多,它是一个地址的引用,但没有生成内存。所以我们能够预先为程序赋予要执行的方法。不止如此,interface在设计模式的作用更是强大,工厂模式,建造者模式,观察者模式无不用到interface。

  • 相关阅读:
    TdxGaugeControl
    TdxSkinController
    delphi TdxMemData 使用
    深入方法(16)- 方法的顺序
    深入方法(15)- 调用其他单元的函数
    深入方法(14)- 在TForm1 类内声明的方法
    深入方法(13)- 在 interface 区声明的方法
    深入方法(12)- implementation 区中的方法
    深入方法(11)- 参数前缀
    深入方法(10)- 默认参数
  • 原文地址:https://www.cnblogs.com/dongweiq/p/4096520.html
Copyright © 2020-2023  润新知