如何实现AlertDialog依次显示并自动消失?
问题原因分析
你遇到的问题核心在于UI线程被阻塞了:OnCreate方法本身是在Android的UI线程中执行的,而你在循环里调用System.Threading.Thread.Sleep(3000)会直接卡住UI线程。这意味着在整个循环执行完成之前,系统根本没有机会去更新UI、显示任何对话框——直到循环结束,i已经变成5,才会执行最后一次ShowAlert,所以你只能看到内容为“5”的对话框。
解决方案:用异步非阻塞方式实现
我们需要用异步操作来避免阻塞UI线程,同时按顺序依次显示并关闭对话框。这里推荐使用C#的async/await结合Task.Delay,它能在不阻塞UI线程的前提下实现延迟逻辑。
修改后的代码如下:
[Activity(Label = "TestAlertDialogBuilder", MainLauncher = true)] public class MainActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); // 启动异步任务,避免直接在OnCreate里阻塞UI线程 StartSequentialAlerts(); } private Dialog _currentDialog; private async void StartSequentialAlerts() { for (int i = 1; i <= 5; i++) // 从1开始,匹配你要显示1-5的需求 { ShowAlert(i); // 等待3秒,await不会阻塞UI线程,系统能正常处理UI更新 await Task.Delay(3000); // 关闭当前对话框,为下一个对话框让路 _currentDialog?.Cancel(); } } public void ShowAlert(int i) { // 先关闭未结束的对话框,避免叠加 _currentDialog?.Cancel(); AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.SetMessage(i.ToString()); _currentDialog = alertDialog.Create(); _currentDialog.Show(); } }
关键修改点说明
- 将循环逻辑放到异步方法
StartSequentialAlerts中,用async/await实现非阻塞延迟:Task.Delay会在后台等待,不会卡住UI线程,系统可以正常处理对话框的显示和UI更新。 - 调整循环起始值为1(原代码从0开始,会先显示0再到5,和你需求的1-5不符)。
- 每次显示新对话框前,先关闭上一个,避免多个对话框叠加显示。
- 用
_currentDialog字段跟踪当前显示的对话框,确保可以正确关闭。
这样修改后,程序会依次显示1到5的对话框,每个显示3秒后自动关闭,然后显示下一个,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Profile3ForStack
相关产品推荐
相关产品推荐

