Xamarin 进度对话框未按预期显示

Xamarin progress dialog not showing as expected

单击菜单项时,我需要更新多个 EditText 视图。代码是这样的。在此过程中,我想显示一个进度对话框。

 public override bool OnOptionsItemSelected(IMenuItem item)
        {
            switch (item.ItemId)
            {                
                case Resource.Id.updateid:
                    var progressDialog = ProgressDialog.Show(this, "", "Updating...", true);
                    progressDialog.SetProgressStyle(ProgressDialogStyle.Spinner);

                    new Thread(new ThreadStart(delegate
                    {
                        RunOnUiThread(() =>
                        {
                            for (int i = 0; i < 100; i++)
                            {                                
                                eTxt[i].Text = slnArray[i].ToString();                               
                            }
                            progressDialog.Dismiss();
                        }
                        );             
                    })).Start();

                    return true;
                default:
                    return base.OnOptionsItemSelected(item);
            }
        }

有时会出现进度对话框,有时不会。大多数是第一次出现,然后没有出现。第二次挂了

如果出现对话框,它不会旋转,看起来像一些静态图像。

问题1)如何让这个对话框一直出现?

问题2)我怎样才能让它旋转?

注意:我尝试将 progressDialog.Dismiss() 保留在另一个 RunOnUiThread() 内以及线程外。两种方式都失败了。

我怀疑您的 for (int i = 0; i < 100; i++) 循环发生得太快以至于 UI 没有机会更新屏幕。尝试添加 await Task.Delay (50); 以模拟在 Thread.

中发生的更多工作

示例:

new Thread (new ThreadStart (delegate {
    RunOnUiThread (async() => {
        for (int i = 0; i < 100; i++) {
            // Simulate some work here in order for the progress spinner to update
            await Task.Delay (50);
            //eTxt[i].Text = slnArray[i].ToString();                               
        }
        progressDialog.Dismiss ();
    }
    );             
})).Start ();

注意: 除非你的 Thread 中的某些东西实际上正在更新 UI 的内容,你可以删除 RunOnUiThread 委托作为不需要。

new Thread (new ThreadStart (async delegate {
    for (int i = 0; i < 100; i++) {
        // Simulate some work here in order for the progress spinner to update
        await Task.Delay (50);
        //eTxt[i].Text = slnArray[i].ToString();                               
    }
    RunOnUiThread (() => {
        progressDialog.Dismiss ();
    });
})).Start ();

甚至不需要包装对话框解雇,因为对话框的 Activity/Fragment 解雇使 UI 无效,OS 将在下一帧绘制时更新它:

new Thread (new ThreadStart (async delegate {
    for (int i = 0; i < 100; i++) {
        // Simulate some work here in order for the progress spinner to update
        await Task.Delay (50);
        //eTxt[i].Text = slnArray[i].ToString();                               
    }
    progressDialog.Dismiss ();
})).Start ();