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