Android Java开发中如何确保线程执行完成后再继续后续逻辑
Android Java 等待线程执行完成再运行后续逻辑的实现方案
你当前的写法会导致后续代码在线程还没跑完的时候就直接执行,因为子线程是异步运行的,不会阻塞主线程的执行流程。Android 禁止在主线程执行网络请求,也不能直接阻塞主线程等待子线程,否则会触发 ANR(应用无响应)错误,以下是几种最优的实现方式:
方案1:回调接口(最推荐,无额外依赖)
这是适配你当前场景的最优方案,逻辑简单,不需要引入额外库:
- 把要执行的后续逻辑封装成方法,比如
doMoreWork() - 子线程跑完
myMethod()之后,切换到对应线程执行后续逻辑:
MyClass myclass = new MyClass(); new Thread() { public void run() { // 执行耗时网络请求 myclass.myMethod(); // 如果后续逻辑需要操作UI,必须切回主线程执行 runOnUiThread(new Runnable() { @Override public void run() { // 这里放你原来写在// More work here的逻辑 doMoreWork(); } }); // 如果后续逻辑不需要操作UI,直接在当前子线程执行即可,不需要切主线程 // doMoreWork(); } }.start();
方案2:ExecutorService + Future(适合多任务管理场景)
如果有多个异步任务需要统一管理,可以用线程池方案:
// 初始化单线程池 ExecutorService executor = Executors.newSingleThreadExecutor(); MyClass myclass = new MyClass(); Future<Void> taskFuture = executor.submit(new Callable<Void>() { @Override public Void call() throws Exception { myclass.myMethod(); return null; } }); new Thread(() -> { try { // 阻塞等待任务完成,注意:不能在主线程调用get()方法 taskFuture.get(); // 执行后续逻辑,需要更新UI的话还是要切回主线程 runOnUiThread(this::doMoreWork); } catch (ExecutionException | InterruptedException e) { // 处理任务异常或者中断情况 e.printStackTrace(); } finally { executor.shutdown(); } }).start();
方案3:CountDownLatch(适合多任务同步场景)
如果需要等待多个线程都执行完成再跑后续逻辑,可以用CountDownLatch:
// 配置需要等待的任务数量,这里只等1个 CountDownLatch taskLatch = new CountDownLatch(1); MyClass myclass = new MyClass(); new Thread() { public void run() { try { myclass.myMethod(); } finally { // 任务完成后计数减1 taskLatch.countDown(); } } }.start(); new Thread(() -> { try { // 阻塞等待所有任务完成,不能在主线程调用await() taskLatch.await(); // 执行后续逻辑 runOnUiThread(this::doMoreWork); } catch (InterruptedException e) { e.printStackTrace(); } }).start();
核心注意点
- 所有阻塞等待方法(
join()、get()、await())都不允许在主线程调用,否则会卡住主线程触发ANR - 所有UI更新操作必须在主线程执行,子线程操作UI会直接抛出运行时异常
- 如果项目可以引入第三方库,也可以用RxJava、WorkManager等组件处理异步任务,自带线程切换、异常处理、生命周期绑定能力,逻辑更简洁。
内容的提问来源于stack exchange,提问作者user3194684
相关产品推荐
相关产品推荐

