Java 回调机制详解

一、说明

最近在写代码,发现 Java 回调机制蛮实用。在网上搜索部分资料以后,现在按照自己的理解进行归纳总结 ,有理解错的地方,希望大家能够帮忙指正! 
先从一个很简单的 Android 开发例子说起。我们在界面上使用 Button 时,为其增加点击事件监听大概需要以下几个步骤 : 
① 实例化 Button 对象,如 btn_call_back; 
② btn_call_back.setOnClickListener(MainActivity.this); 
③本类实现 OnClickListener 接口,重写 onClick(View view) 方法。

代码如下,这个时候我们点击按钮就会弹出一段话:”点击到回调方法按钮啦!” 至于为什么能够达到这种效果?就是应用到我们今天主题:Java 回调机制。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_call_back;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_call_back = (Button) findViewById(R.id.btn_call_back);

        btn_call_back.setOnClickListener(MainActivity.this);
    }

    @Override
    public void onClick(View view) {
        //重写 onClick 方法
        Toast.makeText(this,"点击到回调方法按钮啦!",Toast.LENGTH_SHORT).show();
    }
}

二、查看源码

  2.1 OnClickListener 接口。接口很简单,只包含一个 onClick(View var1) 方法,每一个实现接口的类都必须实现 onClick(View var1) 方法。是不是觉得很熟悉呢?没错,就是我们在 MainActivity 中重写的方法。继续往下看

public interface OnClickListener {
    void onClick(View var1);
}

  2.2 setOnClickListener() 方法。这个方法将我们传入的 MainActivity.this 赋值给 mOnClickListener 对象,这样做有什么作用?再看按钮被点击触发的方法

/**
     * 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);
        }
        getListenerInfo().mOnClickListener = l;
    }

  2.3 点击触发的方法 performClick()。这个方法实例 ListenerInfo 类型对象 li 接 mListenerInfo ,当 li != null && li.mOnClickListener != null 时调用 li.mOnClickListener.onClick(this);也就是 MainActivity 类中的我们重写的 onClick(View view) 方法。

    /**
     * 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;
    }

  

三、总结

  3.1 现在我们重新梳理一下回调过程,如下图。首先 MainActivity 调用了 View 类中 setOnClickListener() 方法,将自身传参给 mOnClickListener 对象。当有点击事件到来时,触发 performClick() 方法,这个时候就会回调 onClick() 方法。这个方法就是传参进来的 MainActivity类重写的 onClick() 方法。所以,回调机制就是 A 类调用 B 类的方法,然后B 类反过来调用 A 类的方法。

  3.2 使用规则

  ① A 类实现接口 CallBack ,重写抽象方法 
  ② A 类存在可以调用 B类的引用,如上例中 Button,因为 Button 继承自 View 
  ③ B 类提供一个方法 fun,参数包含 CallBack 接口类型 
  ④ A 类通过引用调用B类方法 fun ,所以B 类就可以回调 A 类重写的抽象方法

  3.3 应用场景

  回调机制应用很广泛,以我现在工作为例子,项目在请求网络数据、版本更新应用到回调机制。由于主线程不能进行耗时操作,必须开子线程获取到数据,这里就可以通过回调机制把获取到的数据传递给主线程,版本更新也是同样的道理,这里就不累赘了。以上属于个人理解,有不懂得可以留言,欢迎大家评论!

时间: 2024-10-24 09:21:51

Java 回调机制详解的相关文章

Android 接口回调机制详解

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误.那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理. 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现

Java 反射机制详解(下)

续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象. 获取字节码文件对象的三种方式.  1.Class class1= Class.forName("全限定类名"); //通过Class类中的静态方法forName,

java异常处理机制详解

java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我们还可以提供一定的应对预案.C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决定的.程序员需要查询大量的资料,才可能找到一个模糊的原因.面向对象语言,比如C++, Java, Python往往有更加复杂的异常处理机制.这里讨论Java中的异常处理机制. 异常处理 Ja

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

【转载】Java反射机制详解

转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个

java反射机制详解 及 Method.invoke解释 getMethod

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理.1. 得到某个对象的属性 public Object getProperty(Obje

java反射机制详解 及 Method.invoke解释

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理.1. 得到某个对象的属性 Java代码   public Object getProp

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S