Android中函数是否总是顺序执行?连续调用会并行或乱序吗
Android场景下顺序书写的依赖函数是否会出现执行顺序颠倒?
有可能出现sortList()提前运行的情况,只有当两个函数均为同线程下的同步执行逻辑时,才会严格按书写顺序执行,否则大概率会出现顺序异常
- 不会出现顺序异常的场景
如果populateList()内部没有任何异步逻辑,全程在当前调用线程(比如主线程)同步执行所有操作,那么下述代码会严格按顺序执行,populateList()完全执行完毕后才会运行sortList(),不会出现顺序颠倒或者并行的情况:
populateList(); sortList();
- 会出现顺序异常的场景
只要populateList()内部包含异步逻辑,就一定会出现sortList()提前执行的问题,常见的异步场景包括:- 内部新开子线程执行耗时操作,比如操作数据库、加载本地文件
- 使用Kotlin协程时,内部启动了未做同步等待的异步任务
- 调用了异步API,比如Retrofit的异步请求、Room的异步查询、系统的异步媒体加载接口等
- 通过Handler、View.post()等方式将任务投递到消息队列延后执行
举一个常见的错误实现示例:
// 错误的populateList实现 void populateList() { new Thread(() -> { // 子线程查询数据库获取数据 List<Data> data = db.userDao().queryAll(); // 把数据赋值给全局的列表变量 targetList.addAll(data); }).start(); } // 调用处 populateList(); sortList(); // 此时子线程还在查询数据,targetList是空的,sort执行完全无效
- 常见的解决方案
- 回调方案:给
populateList()添加完成回调,在回调中执行sortList() - 协程方案:将
populateList()定义为suspend函数,所有内部异步逻辑做同步处理,直接按顺序调用即可 - 链式响应式方案:使用RxJava、Flow等响应式框架,将两个逻辑按依赖关系拼接成链式调用
- 同步等待方案:如果必须保留
populateList()的内部异步逻辑,可以使用CountDownLatch、Future等工具类等待异步任务执行完成后再执行sortList(),注意不要阻塞主线程
- 回调方案:给
内容的提问来源于stack exchange,提问作者AtomicallyBeyond
相关产品推荐
相关产品推荐

