Java 接口回调机制

article/2025/10/8 12:03:10

       日常开发中接口回调机制无处不在,刚开始用时却总是晕晕乎乎,网上也有很多相关的文章介绍,但总是没有看得太明白,今天端午假期正好花时间来总结一下,我们按如下顺序介绍




一、什么是接口回调


       在应用开发中,接口回调机制是一种常用的设计手段,也可以说是一种处理问题的模型,类之间,模块之间,都有一定的调用关系,一般来说,可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法,实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这个调用的过程称为接口的回调,是不是很晕乎,无奈,理论总是很抽象,后面我们会通过具体的实例来验证,看完实例大家可以再回来体会一下,看看是不是这个理


二、回调的应用场景


既然接口回调是开发应用中处理问题的核心手段,那我们来看看它到底有什么应用场景,也就是说具体在什么情况下,我们要想到使用接口回调来解决问题,回调一般用于分层间的互相协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如,作为一个驱动,是底层,它在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将数据交给上层做进一步的处理,另外我们在封装中也经常用到,还有就是 View 的点击事件其实也是使用回调的原理



三、Java 中实现接口回调


原理:首先创建一个对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时,自动调用回调对象方法


例如程序员 A 和 B 之间需要协作,A 告诉 B 这个任务中间的某个环节需要 B 来完成,并且完成后告诉 A,这时候程序员 A 就需要告诉 B 一个联系方式,使 B 完成时来通知自己,这个场景就可以使用回调,

示例代码如下:


1.首先我们先来创建一个回调接口


这里主要是得让程序员 B 干完活如何找到程序员 A


/*** 回调接口* 此接口为联系的方式,程序员A必须要实现此接口* Created by qiudengjiao on 2017/5/27.*/public interface Callback {void event(String result);}

2.创建回调接口的实现类,也就是程序员 A 对象,必须要实现回调接口,要不程序员 B 干完活,没法找到程序员 A

/*** 层序员 A* 层序员 A 是作为上层应用身份出现的,下层应用(程序员 B)是不知道* 有哪些方法,因此它想被下层应用(程序员 B)调用必须实现此接口* Created by qiudengjiao on 2017/5/27.*/public class ProgrammerA implements Callback {//B程序员对象引用private ProgrammerB programmerB;//在构造方法中国持有B程序员的引用public ProgrammerA(ProgrammerB programmerB) {this.programmerB = programmerB;}/*** 程序员A通过这个方法告诉程序员B任务*/public void doEvent(final String event) {//这里用一个线程就是异步,new Thread(new Runnable() {@Overridepublic void run() {//程序员A调用程序员B中的方法,在这里注册回调接口programmerB.doWork(ProgrammerA.this, event);}}).start();}/*** 程序员B完成任务后调用此方法告诉A,也就是程序员A的回调方法** @param result*/@Overridepublic void event(String result) {Log.e("程序员B告诉程序员A:", result);}
}


3.创建控制类,也就是程序员 B 对象


/*** 程序员 B* 必须要注意,这是一个底层类,底层是不了解上层服务的* Created by qiudengjiao on 2017/5/27.*/public class ProgrammerB {public void doWork(Callback callback, String event) {Log.e("程序员A告诉程序员B需要干的事:", event);Log.e("程序员B:", "干活.....");String result = "完成工作";//程序员B在这里调用A回调方法,告诉完成任务callback.event(result);}
}

接着我们来在 MainActivity 中测试一下:

/*** Callback 测试*/
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {ProgrammerB programmerB = new ProgrammerB();ProgrammerA programmerA = new ProgrammerA(programmerB);programmerA.doEvent("编写一个列表界面");}
}


运行结果截图:





到这里我觉得大家对回调也就有了基本的认识,接下来就是需要去亲自动手实践一下,自己体会体会,毕竟实践才是最好的老师


四、接口回调在 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.回调函数


/*** Callback 测试*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener{private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();init();}private void initView() {button  = (Button) findViewById(R.id.button);button.setOnClickListener(this);}private void init() {ProgrammerB programmerB = new ProgrammerB();ProgrammerA programmerA = new ProgrammerA(programmerB);programmerA.doEvent("编写一个列表界面");}/*** 用户点击Button时调用的回调函数* @param v*/@Overridepublic void onClick(View v) {Toast.makeText(this,"onClick",Toast.LENGTH_SHORT).show();}
}


3.View 类的 setOnClickListener 方法


 
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);  //回调方法 mOnClickListener.onClick(this);  return true;  }  return false;  }  
} 


五、总结


1. 必须明确回调函数出现的原因,也就是使用的场景


2.还有就是在工作中,项目中可能会把一部分功能交给被人或别的公司来做,实现个性化定制功能,这里别人具体去怎么实现,我们便无法得知,其实我们也没必要去管,我们只需要做的就是定义好相关接口,这一设计允许了底层代码调用高层定义的子程序,增强了程序的灵活性,这才是回调的真正原因


3.在封装过程中,上层模块封装时,很难知道下层模块是如何实现的,因此,上层模块只需要定义好自己需要但不能预料的接口(也就是回调接口),当下层模块调用上层模块时,根据当前需要的实现回调接口,并通过注册或参数方式传入上层模块即可,这样就实现了下层调用上层,并且上层还能根据传入的引用来调用下层的具体实现,将程序的灵活性大大的增加




http://chatgpt.dhexx.cn/article/qtw2U3v1.shtml

相关文章

Android 接口回调

Android接口回调讲解 回调定义回调机制回调意义接口回调的实现步骤参考 网上看了一堆,感觉有点零散,我自己总结一下。 回调定义 正式定义 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一…

理解Java接口回调

初步认识: 实现步骤: 1、创建一个回调接口。 2、创建一个回调对象实现回调接口。 3、创建一个控制器对象,将回调对象作为参数传给控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时&#…

Android 自定义接口回调

1.定义一个简单的接口回调 下面是定义一个简单的接口,实现的功能是,设置名字爱好,并且返回给主 Activity。 1.1 自定义一个接口 定义一个名字为 setNameListener() 的接口类: /*** author: wu* date: on 2018/10/23.* describ…

接口回调(笔记

接口回调讲解 回调定义回调机制回调意义接口回调的实现步骤参考 网上看了一堆,感觉有点零散,我自己总结一下。看评论区说存在很多问题,我读了一下,雀氏存在一些,非常感谢批评指正,我重新写一写。&#xff0…

接口回调与方法回调

1.1 接口回调 简介: 笔者查阅了大量资料,接口回调没有定义,可以理解为是一种设计思想。 其本质是将实现接口的类通过向上转型至接口类型,通过传入不同的子类,实现调用相应的子类重写的父类接口方法。 详情见&#xff…

Java接口回调详解

一.产生接口回调的场景 在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,"通知我"这个动作就是接口回调的动作.接口回调重在理解思就好.再举个例子用于下面的代码演示,老师让学生做课堂练习,学生做完练习后并告诉老…

java 接口回调的例子_java接口回调

java的接口回调原理网上已经有很多生动形象的例子说明了,在此总结一下个人的理解:类A调用类B的方法b(),类B再回调类A的方法a(),其中方法a()是定义在接口中的,由类A来实现。这是一个双向调用的过程,用下面的类图来加以说明。 Callback.png 1. 创建一个接口: public inter…

巧妙理解接口回调

接口回调目的和用法解析 一、为什么会有接口回调?什么是接口回调? 其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道java中接口是不可以直接创建实例的,那么问题来了,假如…

[Java]什么是接口回调?

什么是接口回调? 1.接口回调是什么[2]? 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现…

自定义动画animate

开发工具与关键技术:VS,MVC 作者:陈梅 撰写时间:2019年6月2 日 所有代码来源与老师教学 这次分享一个好玩的自定义动画效果,这次还是用jQuery做出来的小功能。这次我们先直接看最后已经布局好的效果。 把所想写的内容…

Android自定义动画专题一

Android自定义动画 在目前的移动端产品中,不管是app还是网页一个好看酷炫的页面总是会第一时间吸引人的眼球,那么对于android开发人员来说,要想实现一个好看的页面必然需要掌握自定义控件以及自定义动画这门技术。 1.Android原生动画 Androi…

百度地图添加自定义图标标注以及自定义动画效果

百度地图添加自定义图标标注以及自定义动画效果 1、添加自定义图标标注2、添加自定义动画效果2.1、标注对象marker的构成2.2、自定义动画效果实现过程2.3、最终实现效果 上次写的是添加自定义图标,但是用的是添加自定义覆盖物方法,结果不支持点聚合&…

Vue中如何进行自定义动画与动画效果设计

Vue中如何进行自定义动画与动画效果设计 在Vue中,动画效果是非常有用的,它可以使用户界面变得更加生动、有趣,从而提高用户体验。Vue提供了一套非常方便的动画系统,使得我们可以非常容易地实现动画效果。 在本文中,我…

Android 自定义动画(实现类似分享动画)

最近在开发app中,要实现点击进入分享动画页面,然后照着每个Item的功能,来实现各自的功能 效果图如下: 首选自定义动画Activity import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import andr…

UE4 创建自定义动画节点

创建自定义动画节点需要两个类: 一个是您在编辑器中看到的图表节点 一个是真正在运行时工作的行为节点 动画图表节点,派生自:UAnimGraphNode_Base 例如:class UAnimGraphNode_SequencePlayer : public UAnimGraphNode_Base 动画…

ViewPager2添加自定义动画

此篇为ViewPager2的拓展篇,具体可查看ViewPager2的使用 ViewPager2自定义动画的核心是使用PageTransformer来实现,他是ViewPager2中的一个接口 原理 要显示非默认屏幕滑动动画,请实现 ViewPager2.PageTransformer 接口并将其提供给 ViewPa…

jQuery(五)--自定义动画、动画

目录 一、自定义动画 1.1 animate() 1.2 animate()动画执行顺序 1.3 animate()动画回调函数和匀速运动 1.4 animate动画之stop()/delay() 二、动画 2.1 show()/hide()/toggle() 2.2 slideDown()/slideUp()/slideToggle() 2.3 fadeIn()/fadeOut()/fadeTo()/fadeToggle(…

Android ProgressBar 自定义动画

源码地址&#xff1a; https://download.csdn.net/download/dreams_deng/12236355 1. 自定义圆形动画 1.1 布局 <!-- indeterminateDrawable 旋转图片indeterminateDuration 旋转速度--><ProgressBarandroid:id"id/pb_welcome_loading"android:layout_…

Qt自定义动画移动路径

在使用Qt实现动画时&#xff0c;一般使用QPropertyAnimation来实现&#xff0c;一般我们实现控件的移动动画都是走直线&#xff0c;我们如何实现自己想要的移动路径呢&#xff0c;比如走圆弧。下面介绍通过QPropertyAnimation实现自定义动画移动路径&#xff0c;比如走圆曲线、…

Flutter开发之——动画-自定义动画

一 为什么要进行自定义动画 当系统提供的动画不满足业务需求时&#xff0c;就需要我们自己进行自定义动画通过自定义动画&#xff0c;可以提高自定义组件的能力 二 自定义动画过程 继承StatefulWidget &#xff0c;完成动画界面的绘制setState 中动画执行及状态监听并刷新UId…