2016-05-27 9 views
1

Ich benutze async, warten auf die Benutzeroberfläche auf Schaltfläche klicken, um den Benutzer anzuzeigen, dass einige Fortschritte vor sich gehen und ich Lade-Panel onclick Schaltfläche anzeigen. Unten ist mein Code:Xamarin.Forms Aktualisierung UI-Thread verhält sich merkwürdig in iOS & Android

Android:

async void loginButtonGesture_Tapped(object sender, EventArgs e) 
{    
    try 
    { 
    DependencyService.Get<Idevice>().StartLoading(); 
     await AsyncUpdateStatus(); 
    } 
} 


private async Task AsyncUpdateStatus() 
{ 
      try 
      { 
       await Task.Run(() => 
       { 
         //Device.BeginInvokeOnMainThread is used in places to stop loading the screen 
       }); 
      } 
} 

iOS:

async void loginButtonGesture_Tapped(object sender, EventArgs e) 
    {    
     try 
     { 
     DependencyService.Get<Idevice>().StartLoading(); 
      await Task.Delay(40); //Required for iOS, otherwise loading panel is keep on running 
      await AsyncUpdateStatus(); 
     } 
    } 


    private async Task AsyncUpdateStatus() 
    { 
       try 
       { 

        //await Task.Run(() => Enabling new thread also not working 
        //Device.BeginInvokeOnMainThread is used in places to stop loading the screen 

       } 
    } 

Beide Android & iOS gleichen Forms Code teilt. Aber für diesen speziellen Fall funktioniert es bedingt. iOS funktioniert nach dem Hinzufügen Task.Delay(40) und kommentieren Task.Run(() => {}); Thread.

Warum ist es so? Aber wenn ich über die Änderung in Android mache, funktioniert es nicht. Was genau passiert?

Antwort

0

Irgendwie Sie die UIThread blockieren, gibt es zahlreiche Fragen über Xamarin Foren dazu:

https://forums.xamarin.com/discussion/47019/activity-indicator-inconsistencies

https://forums.xamarin.com/discussion/54237/update-uitextview-text-in-code

https://forums.xamarin.com/discussion/41229/best-practise-waiting-and-synchronising-threads

Und es scheint, dass Sie dies tun in Ihrem Zeigen Sie die Klasse an, das sollten Sie in Ihrem ViewModel tun. Nach Erfahrung ermutige ich Sie, keine Task zu warten, es sei denn, sie ist komplett notwendig d Verwenden Sie Bindings, um dem Benutzer zu ermöglichen, dass etwas vor sich geht!

Die meisten von ihnen beantwortet von Adam

Verwandte Themen