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

点击按钮后ProgressBar无法按代码设置显示的问题求助

解决ProgressBar因主线程阻塞无法显示的问题

你的问题根源在于主线程被耗时API调用阻塞:Android的UI更新必须在主线程完成,但按钮点击事件本身就在主线程执行,设置ProgressBar可见后,立刻执行4秒的API调用,主线程被占用,无法完成ProgressBar的渲染,导致它不显示。注释API后主线程没有阻塞,UI能及时刷新,所以ProgressBar正常显示。

解决方案

使用async/await将耗时操作移到后台线程,同时用try/finally确保操作结束后无论结果如何都隐藏ProgressBar,具体实现如下:

private async void btnProvjeriRate_Click(object sender, System.EventArgs e)
{
    var txtRateUnosBroja = FindViewById<EditText>(Resource.Id.txtRateUnosBroja);
    var txtRateUnosJMBG = FindViewById<EditText>(Resource.Id.txtRateJMBG);

    ProgressBar progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar);
    progressBar.Visibility = ViewStates.Visible;

    try
    {
        if (Util.Functions.validateJMBG(txtRateUnosJMBG.Text))
        {
            if (Util.Functions.ValidatePhoneNumber(txtRateUnosBroja.Text))
            {
                // 将耗时的API调用放到后台线程执行
                await Task.Run(() =>
                {
                    // 这里写入你的API调用代码
                    // 注意:后台线程不能直接操作UI,若需更新UI需用RunOnUiThread
                    // 示例:
                    // RunOnUiThread(() => 
                    // {
                    //     Snackbar.Make(FindViewById(Android.Resource.Id.Content), "操作完成", Snackbar.LengthShort).Show();
                    // });
                });
            }
            else
            {
                Snackbar snackbar = Util.Functions.generateNotification(FindViewById(Android.Resource.Id.Content), "Neispravan format broja");
                snackbar.Show();
            }
        }
        else
        {
            Snackbar snackbar = Util.Functions.generateNotification(FindViewById(Android.Resource.Id.Content), "Neispravno unesen JMBG");
            snackbar.Show();
        }
    }
    finally
    {
        // 无论操作成功/失败,最终都隐藏ProgressBar
        progressBar.Visibility = ViewStates.Gone;
    }
}

注意事项

  • 后台线程中禁止直接操作UI,如果API调用后需要更新UI(比如显示结果提示),必须通过RunOnUiThread()将UI操作切换回主线程。
  • async/await是Xamarin.Android中处理异步操作的推荐方式,相比传统AsyncTask更简洁易维护。

内容的提问来源于stack exchange,提问作者makse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:39