2016-10-05 4 views
0

Ich beginne mein Abenteuer mit Mobile-Entwicklung und schon ein Problem. Ich weiß in WPF, dass ich BackgroundWorker verwenden würde, um UI zu aktualisieren, aber wie funktioniert es mit Android? Ich habe viele Ratschläge gefunden, aber nichts davon hat für mich funktioniert. Code unten ändert den Text nicht, während der Rest ausgeführt wird, er wartet nur auf und führt alle auf einmal aus, was nicht das ist, was ich will.UI wird erst aktualisiert, wenn die Methode beendet wurde. (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

Ich würde empfehlen, auf ReactiveUI im Allgemeinen zu schauen, es wird Ihnen mit diesem Problem helfen, und es wird _force_ Sie MVVM verwenden, anstatt Logik in Button Event Handler zu schreiben. –

Antwort

3

hier Ihre Aktion aus einer Aktionstaste klicken kommt, so dass Sie verwenden müssen, um RunOnUiThread nicht, weil Sie auf diese Arbeit bereit sind.

Wenn ich richtig Code verstehen es sollte wie folgt aussehen:

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

} 

Der Code innerhalb Task.Run wird asynchron ohne Blockierung der ui aufgerufen werden. Sie können in der Task.Run ein await-Wort verwenden, wenn Sie vor dem Aktualisieren von UI-Elementen auf eine bestimmte Arbeit warten müssen.

0

Es gibt viele Möglichkeiten, dies zu tun, aber in der Form Ihres Beispielcode:

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

Zur Info: Es gibt einige große Bibliotheken, die eine reaktive Nutzererfahrung helfen kann, mit ReactiveUI Wesen an der Spitze meiner Liste, wie es auch ist ein MVVM-Framework ...

+0

warum "Task.Run (async() =>"? Es ist nicht notwendig, weil es keinen Vorteil mit "warten" gibt. – Gabsch

+0

Aber mit einem asynchronen Event-Handler (reactive muss dies unterstützen, aber ich weiß nicht) brauchen Sie nicht .. neue Aufgabe Await wird nur dort warten, bis die Task.Delay kehrt – Gabsch

+0

so ist dies nicht möglich btnAccept.Click + = (object sender, System.EventArgs e) async() => { erwarten einige; }? ; – Gabsch

Verwandte Themen