我开始使用移动开发我的冒险并且已经遇到了问题。我知道在WPF中我会使用BackgroundWorker来更新UI,但它如何与Android一起使用?我找到了许多建议,但这些都不适合我。下面的代码在执行休息时不会改变文本,它只是等待并立即执行,这不是我想要的。
private void Btn_Click(object sender, System.EventArgs e)
{
RunOnUiThread(() => txt.Text = "Connecting...");
//txt.Text = sql.testConnectionWithResult();
if (sql.testConnection())
{
txt.Text = "Connected";
load();
}
else
txt.Text = "SQL Connection error";
}
答案 0 :(得分:3)
此处您的操作来自按钮单击操作,因此您无需使用RunOnUiThread,因为您已准备好处理此操作。
如果我理解你的代码,它应该是这样的:
private void Btn_Click(object sender, System.EventArgs e)
{
txt.Text = "Connecting...";
//do your sql call in a new task
Task.Run(() => {
if (sql.testConnection())
{
//text is part of the UI, so you need to run this code in the UI thread
RunOnUiThread((() => txt.Text = "Connected"; );
load();
}
else{
//text is part of the UI, so you need to run this code in the UI thread
RunOnUiThread((() => txt.Text = "SQL Connection error"; );
}
});
}
Task.Run中的代码将异步调用而不会阻止ui。 如果在更新UI元素之前需要等待特定的工作,可以在Task.Run中使用等待单词。
答案 1 :(得分:0)
有很多方法可以做到这一点,但是以示例代码的形式:
button.Click += (object sender, System.EventArgs e) =>
{
Task.Run(async () =>
{
RunOnUiThread(() => txt.Text = "Connecting...");
await Task.Delay(2500); // Simulate SQL Connection time
if (sql.testConnection())
{
RunOnUiThread(() => txt.Text = "Connected...");
await Task.Delay(2500); // Simulate SQL Load time
//load();
}
else
RunOnUiThread(() => txt.Text = "SQL Connection error");
});
};
仅供参考:有一些很棒的库可以帮助创建被动用户体验,ReactiveUI
位于我的列表顶部,因为也是MVVM框架... < / p>
答案 2 :(得分:0)