2016-10-05 2 views
0

Я начинаю свое приключение с мобильного развития и уже столкнулся с проблемой. Я знаю, что в WPF я бы использовал BackgroundWorker для обновления интерфейса, но как он работает с Android? Я нашел много советов, но ни один из них не работал для меня. Код ниже не изменит текст во время ожидания, он просто ждет и выполняет все сразу, что не то, что я хочу.Пользовательский интерфейс не обновляется до завершения метода. (Xamarin)

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

Я бы рекомендовал посмотреть на ReactiveUI в целом, это поможет вам справиться с этой проблемой, плюс вам придется использовать MVVM вместо написания логики в обработчиках событий кнопок. –

ответ

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 будет вызываться асинхронно, не блокируя пользовательский интерфейс. Вы можете использовать слово ожидания внутри Task.Run, если вам нужно ждать определенной работы перед обновлением элементов пользовательского интерфейса.

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"); 
    }); 
}; 

FYI: Есть некоторые большие библиотеки, которые могут помочь создать реактивный пользовательский опыт, с ReactiveUI существами в верхней части моего списка, так как он также является MVVM каркасом ...

+0

почему «Task.Run (async() =>» «его не нужно, потому что это не дает никакой пользы от« ожидания ». – Gabsch

+0

Но с обработчиком событий async (реактивный должен поддерживать это, но я не знаю) вам не нужно .. новая задача Await будет просто ждать там до возвращения Task.Delay – Gabsch

+0

так что это не возможно btnAccept.Click + = (объект отправителя, System.EventArgs е) асинхронная() => { ждут некоторые; }? ; – Gabsch

Смежные вопросы