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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:02:51