在方法完成之前,UI不会更新。 (Xamarin)

时间:2016-10-05 06:57:47

标签: c# android xamarin

我开始使用移动开发我的冒险并且已经遇到了问题。我知道在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";
    }

3 个答案:

答案 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)