点击按钮后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
相关产品推荐
相关产品推荐

