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

Android中如何让方法内后续代码仅在当前异步方法执行完成后运行

解决方案

你遇到的问题核心是SDK的initialise是异步方法,调用后不会阻塞当前线程,所以会直接执行后续的getParams,此时初始化还未完成自然返回null。以下是两种适配你的需求的实现方案:


方案1:广播接收器 + 回调实现(符合你提到的广播实现思路)

第一步:修改Helper类,增加初始化完成回调,内置广播监听

class Helper {
    private SDK obj = new SDK();
    private BroadcastReceiver initReceiver;
    // 初始化完成回调接口
    public interface OnInitCompleteListener {
        void onInitSuccess();
        void onInitFailed();
    }

    public void initialise(Context context, OnInitCompleteListener listener) {
        // 先注册广播监听初始化完成事件
        initReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (INTENT_INITIALISATION_ACTION.equals(intent.getAction())) {
                    // 收到初始化完成广播,触发回调
                    listener.onInitSuccess();
                    // 用完记得注销广播,避免内存泄漏
                    context.unregisterReceiver(initReceiver);
                }
            }
        };
        context.registerReceiver(initReceiver, new IntentFilter(INTENT_INITIALISATION_ACTION));
        // 执行SDK初始化
        obj.initialise(context);
    }

    public Params getParams() {
        return obj.getParameters();
    }
}

第二步:修改Bridge类,改为异步回调方式获取参数

class Bridge {
    private Helper helper = new Helper();
    // 改成带回调的方法,因为初始化是异步的,不能直接同步返回Params
    public void getParams(Context context, Consumer<Params> resultCallback) {
        helper.initialise(context, new Helper.OnInitCompleteListener() {
            @Override
            public void onInitSuccess() {
                // 初始化完成后再调用getParams,回传给调用方
                Params params = helper.getParams();
                resultCallback.accept(params);
            }

            @Override
            public void onInitFailed() {
                // 初始化失败的处理逻辑,比如回传null
                resultCallback.accept(null);
            }
        });
    }
}

业务层调用示例:

bridge.getParams(context, params -> {
    if (params != null) {
        // 拿到参数后执行后续业务逻辑
    } else {
        // 初始化失败的异常处理
    }
});

方案2:同步阻塞等待实现(仅适用子线程调用场景)

如果你是在子线程调用该逻辑,可以用CountDownLatch实现阻塞等待,不需要修改原有方法的返回结构:

class Helper {
    private SDK obj = new SDK();
    private CountDownLatch initLatch = new CountDownLatch(1);
    private BroadcastReceiver initReceiver;

    public void initialise(Context context) {
        initReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (INTENT_INITIALISATION_ACTION.equals(intent.getAction())) {
                    initLatch.countDown();
                    context.unregisterReceiver(initReceiver);
                }
            }
        };
        context.registerReceiver(initReceiver, new IntentFilter(INTENT_INITIALISATION_ACTION));
        obj.initialise(context);
    }

    public Params getParams() throws InterruptedException {
        // 阻塞等待初始化完成,最多等10秒避免长时间无响应
        initLatch.await(10, TimeUnit.SECONDS);
        return obj.getParameters();
    }
}

注意:该方案禁止在主线程调用,否则会阻塞主线程导致ANR异常。


通用注意事项

  • 广播接收器使用完成后必须及时注销,避免内存泄漏
  • 建议增加初始化超时判断和失败回调逻辑,避免无意义的长时间等待
  • 优先使用异步回调方案,适配主线程调用场景

内容的提问来源于stack exchange,提问作者Sarthak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:06:03