当前位置: 首页 > news >正文

Android回调机制入门

Android回调机制入门

在 Android 开发中,回调(Callback)是实现组件间通信的核心机制。本文作为一篇入门文章,将从基础的接口回调讲起,帮助理解不同场景下的回调实现方式。


1. 回调基础概念

回调(Callback)是一种编程模式,指的是一个方法在某个操作完成后,主动调用另一个方法来处理结果。简单来说,回调就是一种机制,允许你把一个函数(方法)作为参数传递给另一个函数,等那个函数执行完,再调用这个被传入的方法。

在Android开发中,回调常用于:

  • 异步任务(如网络请求、数据库查询)
  • 事件监听(如按钮点击、传感器数据变化)
  • 模块间通信(如Activity与Fragment交互)

2. 为什么需要回调?

在Android中,像网络请求、文件读写等很多操作都是异步的(相对于同步而言,让耗时操作在 “后台线程” 执行,主线程继续处理 UI 交互),主线程(UI线程)不能直接等待这些操作完成,否则会导致界面卡顿回调的作用就是让程序在异步操作完成后,自动触发指定的方法,这样可以 ​避免阻塞主线程​(UI线程),实现模块解耦​(调用方和被调用方分离)等.


3.应用场景

笔者是在做手机计算器时有以下两个活动,一个计算界面一个历史记录界面,历史记录界面是一个ToolBarRecyclerView,想要实现点击RecyclerView的item然后返回计算界面并将该item的数据放到计算界面,从活动间返回数据使用的是ActivityResultLauncher,(startActivityForResult()也可以,但是被废弃基本不用了)但是对item的监听是放在Adapter中onBindViewHolder()方法中,监听到按键按下后还需要先给历史记录对应的活动返回该数据,这时候就需要用到回调了,等到item被点击后,触发逻辑返回数据给上一层。
在这里插入图片描述

3. Android回调的实现方式

RecyclerVIew中子item向活动返回数据

在Android中,回调通常通过实现,直接上代码。

这是Adapter的代码,只保留了回调部分代码。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private List<String> list;OnItemClickListener listener;public MyAdapter(List<String> list) {Collections.reverse(list);this.list  = list;}public interface OnItemClickListener {void onItemClick(int position, String data);}public void setOnItemClickListener(OnItemClickListener listener) {this.listener = listener;}......@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.tv.setText(list.get(position));holder.tv.setOnClickListener(v -> {String data = list.get(position);if (listener != null) listener.onItemClick(position, data);});}......
}

下面这是对应的HistroyRecord活动代码

public class HistoryRecordActivity extends AppCompatActivity {private List<String> list = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_history_record);......MyAdapter adapter = new MyAdapter(list);adapter.setOnItemClickListener((position, data) -> {Intent resultIntent = new Intent();resultIntent.putExtra("HistoryRecord", data); // 数据封装到IntentsetResult(RESULT_OK, resultIntent); // 设置结果码和Intentfinish(); // 关闭当前Activity});recyclerView.setAdapter(adapter);......}......
}

在代码中,MyAdapter类定义了一个OnItemClickListener接口,并通过setOnItemClickListener方法接收外部传入的回调实例。当用户点击列表项时,onBindViewHolder方法中会触发listener.onItemClick(position, data),将点击事件回调给HistoryRecordActivity

HistoryRecordActivity 中,通过 adapter.setOnItemClickListener(...)MyAdapterlistener 赋值了一个具体的实现。当用户点击 RecyclerView 的条目时,MyAdapter 会调用 listener.onItemClick(...),而实际执行的是 HistoryRecordActivity 中定义的逻辑。

然后resultIntent就将得到的intent返回给计算界面对应的活动。另外,ActivityResultLauncher的底层也是回调,只是优化了startActivityForResult()

ActivityResultLauncher 通过 ActivityResultContract 和 ActivityResultCallback 两个接口实现回调逻辑:

  • ActivityResultContract:定义输入参数(如 Intent)与输出结果的映射关系(如启动相机返回 Bitmap)

  • ActivityResultCallback:定义结果处理逻辑,通过 onActivityResult() 方法接收解析后的结果

网络请求回调(异步操作)

比如你写一个方法去请求服务器,但请求是异步的(要等一会),不能立即返回结果。这时候就需要用回调。我们传入了一个实现了 DataCallback 接口的匿名类对象,当 fetchData() 内部的任务完成后,就会调用你传入的对象的方法。

public interface DataCallback {void onSuccess(String data);void onFailure(Exception e);
}public void fetchData(DataCallback callback) {// 假设异步请求boolean success = true; // 模拟if (success) {callback.onSuccess("数据加载成功");} else {callback.onFailure(new Exception("加载失败"));}
}
fetchData(new DataCallback() {@Overridepublic void onSuccess(String data) {Log.d("TAG", "成功: " + data);}@Overridepublic void onFailure(Exception e) {Log.e("TAG", "失败: " + e.getMessage());}
});

4.总结

  • 回调的核心思想:A做完某件事后,通知B去处理后续逻辑。
  • Android中的常见回调:网络请求、事件监听、数据库查询等。

掌握回调机制后,就能更灵活地处理Android中的异步任务和事件交互。这篇博客只是很简单地介绍了回调的思想与应用场景,具体深入的还很复杂,需要继续探索

http://www.dtcms.com/a/287171.html

相关文章:

  • 工程图矢量化 笔记 | potrace ezdxf svgpathtools | png转svg保存dxf用matplotlib画出来
  • 基于springboot的考研互助小程序
  • Redis的持久化-RDB
  • 【橘子分布式】gRPC(编程篇-中)
  • 基于开放API接口采集的定制开发开源AI智能名片S2B2C商城小程序数据整合与增长策略研究
  • 通过phpStudy,用nginx部署vue项目,支持部署多套vue项目(详细教程)
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • CSS-in-JSVue的解决方案
  • 将HTML+JS+CSS数独游戏包装为安卓App
  • 前端-CSS-day6
  • 从零开始学Tailwind CSS : 颜色配置原理与实践
  • Django3 - Web前端开发基础 HTML、CSS和JavaScript
  • 【爬虫】04 - 高级数据存储
  • VLA--Gemini_Robotics: 论文阅读 -- 直接控制机器人的视觉-语言-动作(VLA)模型
  • 如何理解华为横向虚拟化CSS+iStack
  • Attu-Milvus向量数据库可视化工具
  • [牛客2020提高赛前集训营day3] 牛半仙的魔塔
  • Oracle RU19.28补丁发布,一键升级稳
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(三)
  • .NET 8 中的 KeyedService
  • Python数据分析案例79——基于征信数据开发信贷风控模型
  • rust实现的快捷补全到剪贴板的实用工具
  • Matplotlib和Plotly知识点(Dash+Plotly分页展示)
  • 6-大语言模型—预训练:数据处理
  • Linux系统环境下 Node.js 20 安装实践:glibc 2.17 兼容方案与工具链优化
  • Redis安全加固:从漏洞防护到纵深防御体系搭建
  • 《汇编语言:基于X86处理器》第8章 高级过程(3)
  • PCIe Base Specification解析(一)
  • JS逆向 - 东、深、昆航查询参数
  • FPGA自学——二选一多路选择器