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
相关产品推荐
相关产品推荐

