接口回调与方法回调

article/2025/10/8 12:51:23

1.1 接口回调

简介:
笔者查阅了大量资料,接口回调没有定义,可以理解为是一种设计思想。
其本质是将实现接口的类通过向上转型接口类型,通过传入不同的子类,实现调用相应的子类重写的父类接口方法
详情见:https://blog.csdn.net/qq_43530326/article/details/126261199?spm=1001.2014.3001.5501

什么是方法回调?

是将功能定义与功能分开的一种手段,一种解耦合的设计思想;
在Java中回调是通过接口来实现的,。不同的用户调用同一种方法可以满足其对应的不用需求。

例子:

有狗,猫,鸟三种动物,需要调用一个名为Animal 接口的call()方法。建立了三个类 dog类,cat类,bird类都实现Animal接口,且call()方法都不相同。现在三个类对应的三个实体都调用了接口的call()方法,需要让其实现不同的叫声。

代码实现:

public interface Animal {public void call();
}
public class Dog implements Animal{@overridepublic void call(){//这里是Dog自己对接口方法的实现... ...}
}
public class Cat implements Animal{@overridepublic void call(){//这里是Cat自己对接口方法的实现......}
}
public class Bird implements Animal{@overridepublic void call(){//这里是Bird自己对接口方法的实现......}
}
public class Deal{public void doSth(Animal animal){animal.call();//此步骤需要用到接口animal的功能//处理其他事务... ...}
}
//类Deal中用到了接口animal的功能,但是在定义时无法确定是哪一个实现Animal的子类,直接使用了接口Animal的句柄“Animal animal”,然后调用father的方法call()来处理,具体运行是再根据实例化对象调用相应的实现方法:
public static void main(String[] args){Deal deal = new Deal();Animal animalA = new Dog();Animal animalB = new Cat();Animal animalC = new Bird();deal.doSth(animalA);//调用的是animalA对接口的实现deal.doSth(animalB);//调用的是animalB对接口的实现deal.doSth(animalC);//调用的是animalB对接口的实现
}

这就达到了具体实现与事务处理的解耦。在类Deal处理事务过程中不需要知道实现接口的子类,这样可以方便的扩充和维护代码,即设计模式的开闭原则(对扩展开放,对修改关闭)。上面的代码中,animalA、animalB、animalC都可以称为接口回调对象,它们虽然被声明为接口Animal类型,但是在实例化时却是实现的某个子类。

1.2 Android回调的事件处理机制详解

在Android中基于回调的事件处理机制使用场景有两个:

转载自:https://www.runoob.com/w3cnote/android-tutorial-callback-event-handle.html

1.2.1自定义view

当用户在GUI组件上激发某个事件时,组件有自己特定的方法会负责处理该事件 。

通常用法:

  1. 继承基本的GUI组件。
  2. 重写该组件的事件处理方法,即自定义view 。
    注意:在xml布局中使用自定义的view时,需要使用"全限定类名"

实现代码: MyButton.java

public class MyButton extends Button{  private static String TAG = "呵呵";  public MyButton(Context context, AttributeSet attrs) {  super(context, attrs);  }  //重写键盘按下触发的事件  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {  super.onKeyDown(keyCode,event);  Log.i(TAG, "onKeyDown方法被调用");  return true;  }  //重写弹起键盘触发的事件  @Override  public boolean onKeyUp(int keyCode, KeyEvent event) {  super.onKeyUp(keyCode,event);  Log.i(TAG,"onKeyUp方法被调用");  return true;  }  //组件被触摸了  @Override  public boolean onTouchEvent(MotionEvent event) {  super.onTouchEvent(event);  Log.i(TAG,"onTouchEvent方法被调用");  return true;  }  
} 

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context=".MyActivity">  <example.jay.com.mybutton.MyButton  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="按钮"/> 

代码解析:

因为我们直接重写了Button的三个回调方法,当发生点击事件后就不需要我们在Java文件中进行 事件监听器的绑定就可以完成回调,即组件会处理对应的事件,即事件由事件源(组件)自身处理!

1.2.2基于回调的事件传播

img

综上,就是如果是否向外传播取决于方法的返回值是时true还是false;

代码示例:

public class MyButton extends Button{  private static String TAG = "呵呵";  public MyButton(Context context, AttributeSet attrs) {  super(context, attrs);  }  //重写键盘按下触发的事件  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {  super.onKeyDown(keyCode,event);  Log.i(TAG, "自定义按钮的onKeyDown方法被调用");  return false;  }  
}

main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context=".MyActivity">  <example.jay.com.mybutton.MyButton  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="自定义按钮"  android:id="@+id/btn_my"/>  
</LinearLayout>  

MainActivity.java:

public class MyActivity extends ActionBarActivity {  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_my);  Button btn = (Button)findViewById(R.id.btn_my);  btn.setOnKeyListener(new View.OnKeyListener() {  @Override  public boolean onKey(View v, int keyCode, KeyEvent event) {  if(event.getAction() == KeyEvent.ACTION_DOWN)  {  Log.i("呵呵","监听器的onKeyDown方法被调用");  }  return false;  }  });  }  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {  super.onKeyDown(keyCode, event);  Log.i("呵呵","Activity的onKeyDown方法被调用");  return false;  }  
} 

运行截图:

img

结果分析: 从上面的运行结果,我们就可以知道,传播的顺序是: 监听器—>view组件的回调方法—>Activity的回调方法了;


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

相关文章

Java接口回调详解

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

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

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

巧妙理解接口回调

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

[Java]什么是接口回调?

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

自定义动画animate

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

Android自定义动画专题一

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

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

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

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

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

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

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

UE4 创建自定义动画节点

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

ViewPager2添加自定义动画

此篇为ViewPager2的拓展篇&#xff0c;具体可查看ViewPager2的使用 ViewPager2自定义动画的核心是使用PageTransformer来实现&#xff0c;他是ViewPager2中的一个接口 原理 要显示非默认屏幕滑动动画&#xff0c;请实现 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…

JQuery自定义动画——animate()学习

JQuery自定义动画——animate()学习 可以使 用animate 方法创建和实现自定义动画&#xff0c;animate() 方法通过执行 CSS 属性集的自定义动画&#xff0c;满足更多复杂多变的要求。 该方法通过CSS样式将元素从一个状态改变为另一个状态。即通过CSS属性值逐渐改变的&#xff0…

搞定动画之 JQuery 中的自定义动画

古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志——苏轼 写在前面 所谓的自定义动画就是通过 jQuery 提供的方法来完成我们自己想要的动画效果 animate()方法 jQuery 提供了 animate() 方法完成自定义动画效果&#xff0c;该方法具有两种用法。 用…

animate.css 自定义动画

在使用animate.css 的时候 动画的高度超过了预期的高度 在这种情况下肯定是过不了测试的&#xff0c;怎么办的&#xff1f; <div class"fold-div animated " :class"{slideInDown:foldDivHeightShow}" </div>上边代码可以知道 用的是 slideInDown…

JQuery中的animate自定义动画

animate()方法用于创建自定义动画。 概述 .animate( properties [, duration ] [, easing ] [, complete ] ) properties 类型: PlainObject 一个CSS属性和值的对象,动画将根据这组对象移动。 duration (默认: 400) 类型: Number or String 一个字符串或者数字决定动画将运…

jQuery自定义动画

首先创建一个新的html&#xff0c;在body下面输入源代码&#xff1b;div标签代表的是颜色的面板&#xff0c;button标签代表的是按钮当我们输入好了源代码之后呢&#xff0c;那我们的源代码部分已经完成了&#xff0c;接下来剩下的就只有css样式和jQuery函数了 接下来我们先完成…