Java基础之应用向jar包sdk注册回调函数实例(十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Java回调函数介绍
    • 🌻3.代码实例
      • 🐓3.1 实现步骤
      • 🐓3.2 创建回调接口和实现的项目
      • 🐓3.3 创建回调函数interface接口
      • 🐓3.4 实现回调函数
      • 🐓3.5 使用interface接口实现
      • 🐓3.6 实现CallbackResult类
      • 🐓3.7 将Callback.java和CallbackImpl.java生成jar包
      • 🐓3.8 底层回调jar包里的接口,给他返回数据
      • 🐓3.9 使用jar包com.example.jar和MainApp.java联合编译
      • 🐓3.10 运行
      • 🐓3.11 整体命令

🌻1.前言

本篇目的:Java基础之应用向jar包sdk注册回调函数实例

  • 需求:将Callback 接口和它的实现封装在一个 JAR包sdk中,供应用程序使用,步骤如下。

🌻2.Java回调函数介绍

  • 回调函数(Callback Function)是一种在编程中常用的技巧,用于实现事件驱动或异步编程。在 Java 中,回调函数通常用于实现某些方法的延迟执行、事件处理或跨模块的代码调用。虽然 Java 本身没有直接支持回调函数的语法,但可以通过多种方式实现回调机制。
  • 回调函数的定义很简单:当你需要在某个时间点执行一个方法时,你可以将这个方法作为参数传递给另一个方法,当需要执行时,这个方法会被调用。这个被传递的方法就称为回调函数。
  • 在 Java 中,可以通过接口(Interface)和匿名内部类(Anonymous Inner Class)来实现回调函数。下面分别介绍这两种方式。
  1. 通过接口实现回调函数
    接口是 Java 中实现回调函数最常见的方式。你可以定义一个接口,然后在需要的地方实现这个接口,并将实现类作为参数传递给其他方法。
    接口中只定义一个方法,该方法需要被实现类重写。这样,接口就成为了一个回调函数的模板。当其他方法需要一个回调函数时,它只需要一个实现了该接口的参数即可。
  2. 通过匿名内部类实现回调函数
    匿名内部类是 Java 中实现回调函数的另一种方式。匿名内部类允许你在创建对象时就立即调用这个对象的方法。
    匿名内部类通常用于实现接口或继承类。在这种情况下,你可以直接在代码中定义一个匿名内部类,并重写需要的方法。然后,你可以将这个匿名内部类作为参数传递给其他方法。
    使用匿名内部类实现回调函数的优点是代码简洁,无需创建单独的类来实现接口。这使得匿名内部类在需要回调函数的场景中非常方便。
  • Java 中的回调函数主要用于实现事件驱动或异步编程。通过接口和匿名内部类两种方式,可以灵活地实现回调机制。接口方式使得代码更加清晰,易于理解和维护;而匿名内部类方式则使得代码更加简洁,适用于简单的回调场景。掌握回调函数的使用,可以帮助你更好地应对 Java 编程中的各种挑战。

🌻3.代码实例

🐓3.1 实现步骤

1.创建一个独立的 Java 项目来定义和实现 Callback 接口。
2.将这个项目打包成 JAR 文件。
3.在应用程序中使用这个 JAR 文件。

🐓3.2 创建回调接口和实现的项目

基本代码架构
com.example.jar/
├── src/
│   └── com/
│       └── example/
│           ├── Callback.java
│           ├── CallbackImpl.java
│           ├── CallbackManager.java
│           └── CallbackResult.java
├── build/
└── com.example.jar

🐓3.3 创建回调函数interface接口

# mkdir -p src/com/example

# emacs Callback.java

package com.example;
public interface Callback {
    void onCallback(CallbackResult result);
}

🐓3.4 实现回调函数

# emacs CallbackImpl.java
package com.example;

public class CallbackImpl implements Callback {
    @Override
    public void onCallback(CallbackResult result) {
        // 接收回调并处理
        System.out.println("mkey = " + result.mkey + ", value = " + result.mval);
    }
}

🐓3.5 使用interface接口实现

# emacs CallbackManager.java
package com.example;

public class CallbackManager {
    private static Callback mcallback;

    // 注册回调方法
    public static void registerCallback(Callback cb) {
        mcallback = cb;
    }

    // 注销回调方法
    public static void unregisterCallback() {
        mcallback = null;
    }

    public static void send(CallbackResult result) {
        if (mcallback != null) {
            mcallback.onCallback(result);
        } else {
            System.out.println("没有回调接口注册");
        }
    }
}
  • 注意:相当于底层的CarAudioFocus.java拿到应用传来的mcallback后,给他在回调函数中传结构体值就行了。

🐓3.6 实现CallbackResult类

# emacs CallbackResult.java
package com.example;
public class CallbackResult {
    public String mkey;
    public int mval;

    public CallbackResult(String key, int val) {
        this.mkey = key;
        this.mval = val;
    }
}

🐓3.7 将Callback.java和CallbackImpl.java生成jar包

  • <1>.使用javac命令将Java源代码编译成字节码(.class文件)
# javac -d bin src/com/example/*.java
  • 在bin目录下生成Callback.class和CallbackImpl.class文件。

  • <2>.使用jar命令将.class文件生成jar包

# jar cf com.example.jar -C bin  .
  • 将bin目录下的Callback.class和CallbackImpl.class文件生成com.example.jar包。

🐓3.8 底层回调jar包里的接口,给他返回数据

# cd src/
# emacs MainApp.java
import com.example.Callback;
import com.example.CallbackImpl;
import com.example.CallbackManager;
import com.example.CallbackResult;

public class MainApp {
    public static void main(String[] args) {
        // 创建回调接口的实现类实例
        Callback callbackImpl = new CallbackImpl();

        // 注册回调
        CallbackManager.registerCallback(callbackImpl);

    // 创建一个包含 key 和 val 的结构体实例
        CallbackResult result = new CallbackResult("testKey", 55);

        // 发送回调
        CallbackManager.send(result);

        // 注销回调
        CallbackManager.unregisterCallback();
    }
}

🐓3.9 使用jar包com.example.jar和MainApp.java联合编译

# javac -cp com.example.jar src/MainApp.java -d build
  • 将MainApp.java生成的MainApp.class,编译到 build目录下。

🐓3.10 运行

# java -cp build:com.example.jar MainApp
得到回调结果:55

🐓3.11 整体命令

1.使用javac命令将Java源代码编译成字节码(.class文件)
# javac -d bin src/com/example/*.java

2.使用jar命令将.class文件生成jar包
# jar cf com.example.jar -C bin .

3.编译MainApp.java
# javac -cp com.example.jar src/MainApp.java -d build

4.运行
# java -cp build:com.example.jar MainApp
得到回调结果:55
没有回调接口注册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/800579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GNSS技术干货(34):天灵灵 地灵灵 不如C/N0灵

在GPS接收机研发测试过程中&#xff0c;作为硬件射频工程师最关心的测试项目是传导载噪比C/N0&#xff08;carrier-to-noise ratio&#xff09;值&#xff0c;因为它是非常重要的参数指标&#xff0c;可以评估接收机端收到的卫星信号强度&#xff0c;反映硬件射频链路的质量&am…

降Compose十八掌之『突如其来』| Graphics Modifiers

公众号「稀有猿诉」 原文链接 降Compose十八掌之『突如其来』| Graphics Modifiers 在Jetpack Compose中创建自定义绘制内容的方式不止一种&#xff0c;除了前面提到的通过Canvas函数的方式以外&#xff0c;还可以通过Modifier的几个扩展函数更为灵活实现一些的自定义内…

SpringBoot+Vue实现简单的文件上传(Excel篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传xls文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el…

Python爬虫速成之路(4):BeautifulSoup

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

【JVM基础01】——介绍-初识JVM运行流程

目录 1- 引言&#xff1a;初识JVM1-1 JVM是什么&#xff1f;(What)1-1-1 概念1-1-2 优点 1-2 为什么学习JVM?(Why) 2- 核心&#xff1a;JVM工作的原理&#xff08;How&#xff09;⭐2-1 JVM 的组成部分及工作流程2-2 学习侧重点 3- 小结(知识点大纲)&#xff1a;3-1 JVM 组成3…

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说&#xff1a;现在有个word文档,里面有个表格太长&#xff08;如下图所示&#xff09;&#xff0c;希望这一个设置成横的&#xff0c;其余页还是保持竖的&#xff01; 二、解决方案 1、将鼠标放置在该页的最前面闪烁&#xff0c;然后选择“页面”》“↘…

京东.Vision首登苹果Vision Pro 背后的技术探索

去年6月&#xff0c;苹果正式发布首款头显设备Apple Vision Pro&#xff0c;今年6月28号&#xff0c;Apple Vision Pro正式在中国发售。京东.Vision作为首批原生应用登陆Vision Pro平台&#xff0c;首期以家电家居与潮流数码产品作为切入口&#xff0c;未来将逐步拓展至全品类&…

07:串口通信二

串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图&#xff0c;与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD&#xff1…

CentOS搭建邮件服务器:DNS配置方法技巧?

CentOS搭建邮件服务器的流程&#xff1f;如何高效使用CentOS&#xff1f; 在当今数字化时代&#xff0c;邮件服务器的需求日益增加。为了确保邮件能够顺利送达&#xff0c;正确的DNS配置是必不可少的一环。AokSend将详细介绍在CentOS搭建邮件服务器过程中&#xff0c;如何进行…

PyCharm软件初始化配置

安装完pycharm后&#xff0c;需要对其进行个性化设置&#xff0c;分别设置方法如下 目录 一、修改主题二、修改默认字体和大小三、设置拖动滚轮改变字体大小四、常见快捷键 一、修改主题 1、界面右上角点击红框的内容 2、选择Theme选项 3、选择对应的主题 第一二个是白色主题…

怎样去除视频上的水印和文字,视频水印文本移除教程

在观看和分享视频时&#xff0c;我们经常会遇到带有水印或额外文字的情况。这些标记有时是为了版权保护&#xff0c;有时则是平台的标识&#xff0c;但在某些情况下&#xff0c;它们可能会干扰视频的观赏体验。本文将向你介绍常见的视频水印类型以及如何使用简鹿水印助手去除这…

让AI语言模型自由飞翔:LangChain框架的奇妙世界

今天&#xff0c;我将为大家揭开一项令人激动的技术——LangChain。想象一下&#xff0c;如果能将人工智能的强大能力与我们日常使用的数据和工具无缝连接&#xff0c;那将开启怎样崭新且无限的可能&#xff01; LangChain&#xff0c;一个专为大型语言模型设计的框架&#xf…

C语言 ——— 调试的时候如何查看当前程序的变量信息

目录 调试前/后的调试窗口 ​编辑 调试窗口 --- 监视 调试窗口 --- 内存 调试窗口 --- 调用堆栈 调试前/后的调试窗口 调试前的调试窗口&#xff1a; 调试前的调试窗口是没有显示的&#xff0c;只有在调试的时候才会有相对应的调试窗口 调试后的调试窗口&#xff1a…

windows下环境变量开启方式

第一种方法&#xff1a; 使用快捷键打开“运行”对话框&#xff1a;按下 Win R 组合键&#xff0c;这将打开“运行”窗口。 输入系统属性命令&#xff1a;在“运行”窗口中输入 sysdm.cpl 然后按回车键。这将打开“系统属性”对话框。【sysdm.cpl是"System Data Manager…

关于java的反射

❓❓❓反射是啥呀相信许多学java的同学非常困惑在学的时候&#xff0c;总是感觉懂了却又没懂或者直接忽略过去了&#xff0c;那么本文就带大家探讨一下什么是反射在java中以及它的机制和运用。 ⭐️什么是反射&#xff1a; 首先我们知道一些知识&#xff1a; 维基百科的解释 …

C++ | Leetcode C++题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor->val) {anc…

Linux FFmpeg安装教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

白平衡说明

白平衡 相机白平衡的起源原理以及作用起源作用 白平衡的原理白平衡的类型应用说明 工业相机的白平衡效果对比一键白平衡的必要性一键白平衡的实现方式 相机白平衡的起源原理以及作用 起源 白平衡&#xff08;White Balance, WB&#xff09;概念的起源与色温理论密切相关。色温…

【SpringBoot】SpringCache轻松启用Redis缓存

目录&#xff1a; 1.前言 2.常用注解 3.启用缓存 1.前言 Spring Cache是Spring提供的一种缓存抽象机制&#xff0c;旨在通过简化缓存操作来提高系统性能和响应速度。Spring Cache可以将方法的返回值缓存起来&#xff0c;当下次调用方法时如果从缓存中查询到了数据&#xf…

python如何判断变量是否可迭代

python如何判断变量是否可迭代&#xff1f;方法如下&#xff1a; 方法一&#xff1a; 适用于python2和python3 >>> from collections import Iterable >>> isinstance("str", Iterable) True 方法二&#xff1a; 适用于python3 s "hello …