当前位置: 首页 > 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.xdnf.cn/news/1149859.html

相关文章:

  • Ambiguity-Resolved Waveform Design for Cell-free OFDM-Based ISAC Systems
  • QuecPython-正则表达式
  • 研华PCI-1285/1285E 系列------(一概述)
  • LVS(Linux virtual server)-实现四层负载均衡
  • Spring Boot 与微服务详细总结
  • 软件测试理论02—测试流程体系
  • 云端成本治理利器:亚马逊云科技智能仪表盘(AWS Cost Intelligence Dashboard)深度解析
  • 练习三:熟知前端知识
  • Django3 - Web前端开发基础 HTML、CSS和JavaScript
  • web.m3u8流媒体视频处理
  • 服装公司生产管理系统,如何实战提升生产效率?
  • 张量交换维度(转置),其实是交换了元素的排列顺序
  • 如何实现电脑自动关机与定时任务管理
  • ABP VNext + Temporal:分布式工作流与 Saga
  • react+antd 可拖拽模态框组件
  • 尚庭公寓-----day2 业务功能实现
  • 物联网系统中的可视化大屏定义
  • 华为仓颉编程语言语法简介与示例
  • React 的 `cache()` 函数
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(下)
  • Java行为型模式---状态模式
  • 6-大语言模型—预训练:数据处理
  • SpringBoot项目部署至云服务器
  • simulink系列之汽车应用层信号处理
  • Django母婴商城项目实践(九)- 商品列表页模块
  • LVS的简介以及架构
  • Entity Component System架构
  • 【项目分享】动手做一个TypeC转TTL模块(附带原理图)
  • 加法速算之尾数法
  • Windows11下编译好的opencv4.8-mingw,可下载后直接用