Xamarin.Android:ProgressDialog无法正常显示问题求助
ProgressDialog 延迟显示问题:原因与解决办法
你碰到的这个情况其实很常见——明明提前调用了progressDialog.Show(),调试时也看到IsShowing是true,但对话框非要等耗时的SaveImage()跑完才冒出来。核心问题出在主线程被阻塞了。
为什么会这样?
Android的所有UI更新(包括对话框的绘制、显示)都必须在主线程完成。你现在的代码里,调用Show()之后立刻执行了SaveImage(),这个方法占用了主线程的全部资源,系统根本没时间去处理对话框的显示逻辑,直到SaveImage()执行完毕,主线程才有空闲去完成UI更新。
怎么解决?
把耗时的SaveImage()操作放到后台线程执行,让主线程腾出手来处理对话框显示。在Xamarin Android里,用Task.Run()配合异步操作就能轻松搞定,修改后的代码如下:
public override void OnActivityCreated(Bundle savedInstanceState) { base.OnActivityCreated(savedInstanceState); progressDialog = new ProgressDialog(Context); progressDialog.SetCancelable(false); progressDialog.SetMessage("Saving ..."); } private async void Method() { progressDialog.Show(); // 将耗时操作移至后台线程 await Task.Run(() => SaveImage()); // 操作完成后关闭对话框 progressDialog.Dismiss(); } private void SaveImage() { // 你的耗时操作:图片压缩等 mutableBitmap.Compress(Bitmap.CompressFormat.Png, 100, stream); }
关键说明
Task.Run()会把SaveImage()放到后台线程执行,主线程不会被阻塞,能立刻响应对话框的显示请求。await关键字会等待后台任务完成,然后自动切回主线程执行Dismiss(),符合Android UI操作必须在主线程的要求。- 如果
SaveImage()里有任何UI相关的操作(比如更新界面文字),记得用RunOnUiThread()把那部分代码包裹起来,后台线程不能直接操作UI。
内容的提问来源于stack exchange,提问作者Aiko West
相关产品推荐
相关产品推荐

