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

Raj*_*rri 3 c# android progressdialog xamarin

单击菜单项时,我需要更新多个 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

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

问题 1) 如何使此对话框始终出现?

问题 2) 我怎样才能使这个旋转?

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

Sus*_*ver 5

我怀疑您的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 ();
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

注意:除非您的某些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 ();
Run Code Online (Sandbox Code Playgroud)

甚至不需要包装对话框关闭,因为对话框的 Activity/Fragment 关闭已使 UI 无效,操作系统将在下一帧绘制时更新它:

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 ();
Run Code Online (Sandbox Code Playgroud)