在Mono for Android中运行长时间操作时无法显示等待消息

时间:2012-11-07 10:09:50

标签: c# android mono

我正在尝试在长时间操作运行时通过Toast显示等待消息。我正在使用BackgroundWorker。 此代码位于ListView_ItemClick事件处理程序中:

var bgWait = new BackgroundWorker();
bgWait.DoWork += bgWait_DoWork;
bgWait.RunWorkerAsync();
bgWait.RunWorkerCompleted += bgWait_Completed;

bgWait_DoWork事件处理程序中的代码如下:

private void bgWait_DoWork(object sender, DoWorkEventArgs e)
{
var toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long);
toastWait.SetGravity(GravityFlags.Top & GravityFlags.Center, 0, 0);
toastWait.Show();
TimeConsumingOperation();
toastWait.Cancel();
}

当我在调试模式下运行时,似乎只到达了bgWait_DoWork的第一行 - “var toastWait = Toast.MakeText(this,”Please wait“,ToastLength.Long);” - 然后它跳转到bgWait_Completed事件处理程序。

知道为什么会这样吗?

由于

1 个答案:

答案 0 :(得分:2)

您从辅助线程调用与UI相关的API(bgWait_DoWork在辅助线程上执行)。

你必须做这样的事情:

private void bgWait_DoWork(object sender, DoWorkEventArgs e)
{
    Toast toastWait = null;
    RunOnUIThread (() => 
    {
        toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long);
        toastWait.SetGravity(GravityFlags.Top & GravityFlags.Center, 0, 0);
        toastWait.Show();
    });
    TimeConsumingOperation();
    RunOnUIThread (() =>
    {
        toastWait.Cancel(); 
    });
}

}