AsyncTask执行过程中显示AlertDialog加载框不显示问题求解
问题成因
调用AsyncTask.execute().get()会阻塞当前UI线程,直到异步任务执行完毕才会继续执行后续代码。AlertDialog.show()方法仅仅是向UI线程的消息队列插入了一条绘制弹窗的指令,需要UI线程空闲时才会执行渲染。但get()方法占用了UI线程,弹窗始终没有机会完成绘制,等到异步任务执行结束get()返回后,又立刻调用了dismissDialog(),因此看不到加载弹窗。
解决方法
不要使用阻塞UI线程的get()方法,通过AsyncTask自带的生命周期回调处理弹窗展示、关闭和结果回调逻辑即可:
1. 改造CustomAsyncTask,加入生命周期回调处理
public class CustomAsyncTask extends AsyncTask<Void, Void, String> { // 结果回调接口 public interface TaskResultCallback { void onResult(String response); } private LoadingDialogue loadingDialogue; private TaskResultCallback callback; // 构造方法传入弹窗实例和结果回调 public CustomAsyncTask(LoadingDialogue loadingDialogue, TaskResultCallback callback) { this.loadingDialogue = loadingDialogue; this.callback = callback; } // 异步任务执行前运行在UI线程,用于展示弹窗 @Override protected void onPreExecute() { super.onPreExecute(); loadingDialogue.startLoadingDialogue(); } // 运行在后台线程,处理耗时逻辑 @Override protected String doInBackground(Void... voids) { // 此处替换为你原有的后台处理逻辑 return yourProcessedResponseString; } // 异步任务执行后运行在UI线程,用于关闭弹窗和返回结果 @Override protected void onPostExecute(String result) { super.onPostExecute(result); loadingDialogue.dismissDialog(); if (callback != null) { callback.onResult(result); } } }
2. 修改Activity中的调用代码
// 不需要再手动调用弹窗的展示和关闭,也不要调用get()方法 new CustomAsyncTask(loadingDialogue, new CustomAsyncTask.TaskResultCallback() { @Override public void onResult(String responseString) { // 此处处理异步任务返回的结果,比如更新UI } }).execute();
额外注意事项
- AsyncTask已在Android 11(API 30)中正式废弃,新功能开发推荐使用Kotlin协程、WorkManager或RxJava实现异步逻辑。
- 注意处理Activity销毁场景:在Activity的
onDestroy()方法中判断弹窗是否正在显示,主动调用dismiss()避免内存泄漏。
内容的提问来源于stack exchange,提问作者Jason Chan
相关产品推荐
相关产品推荐

