Android回调机制入门
Android回调机制入门
在 Android 开发中,回调(Callback)是实现组件间通信的核心机制。本文作为一篇入门文章,将从基础的接口回调讲起,帮助理解不同场景下的回调实现方式。
1. 回调基础概念
回调(Callback)是一种编程模式,指的是一个方法在某个操作完成后,主动调用另一个方法来处理结果。简单来说,回调就是一种机制,允许你把一个函数(方法)作为参数传递给另一个函数,等那个函数执行完,再调用这个被传入的方法。
在Android开发中,回调常用于:
- 异步任务(如网络请求、数据库查询)
- 事件监听(如按钮点击、传感器数据变化)
- 模块间通信(如Activity与Fragment交互)
2. 为什么需要回调?
在Android中,像网络请求、文件读写等很多操作都是异步的(相对于同步而言,让耗时操作在 “后台线程” 执行,主线程继续处理 UI 交互),主线程(UI线程)不能直接等待这些操作完成,否则会导致界面卡顿回调的作用就是让程序在异步操作完成后,自动触发指定的方法,这样可以 避免阻塞主线程(UI线程),实现模块解耦(调用方和被调用方分离)等.
3.应用场景
笔者是在做手机计算器时有以下两个活动,一个计算界面一个历史记录界面,历史记录界面是一个ToolBar
和RecyclerView
,想要实现点击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(...)
给 MyAdapter
的 listener
赋值了一个具体的实现。当用户点击 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中的异步任务和事件交互。这篇博客只是很简单地介绍了回调的思想与应用场景,具体深入的还很复杂,需要继续探索