You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:45:02