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

3

当点击菜单项时,我需要更新多个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()中,也尝试在线程之外进行。 两种方式都失败了。
1个回答

5

我怀疑你的 for (int i = 0; i < 100; i++) 循环执行得太快了,导致用户界面没有机会及时更新。试试添加 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 ();

enter image description here

注意: 除非你的 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失效,操作系统将在下一帧绘制时更新它:

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 ();

@RajKarri 很高兴能帮到你,愉快编程;-) - SushiHangover
@SushiHangover,对于以下问题有什么主意吗?https://stackoverflow.com/questions/49162412/userdialogs-loading-does-not-show-up - casillas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接