2017-04-14 3 views
0

Ich baue eine Xamarin Forms App und habe ein Problem mit dem Spinner für Netzwerkaktivitäten in der Statusleiste (iOS), der sich immer weiter dreht. Unten ist der Code, den ich verwende, um einen Ladebildschirm anzuzeigen.Netzwerkaktivität Spinner Spins Forever

private async Task ExecuteConfigureCampaignCommand() 
    { 
     if (IsBusy) 
     { 
      return; 
     } 

     IsBusy = true; 
     //ConfigureCampaignCommand.ChangeCanExecute(); 
     bool showAlert = false; 
     string campaign = null; 

     try 
     { 
      campaign = CrossSecureStorage.Current.GetValue(SettingNames.Campaign); 

      if (!String.IsNullOrEmpty(campaign)) 
      { 
       StatusMessage = "Blah"; 
       OnPropertyChanged("StatusMessage"); 

       await Task.Delay(1000); 

       StatusMessage = "Blah"; 
       OnPropertyChanged("StatusMessage"); 

       await Task.Delay(700); 

       StatusMessage = "Blah"; 
       OnPropertyChanged("StatusMessage"); 

       await Task.Delay(500); 

       MessagingService.Current.SendMessage<string>(SettingNames.NavigationSales, campaign); 
      } 
     } 
     catch (Exception e) 
     { 
      var abc = e; 
      showAlert = true; 
     } 
     finally 
     { 
      IsBusy = false; 
      //ConfigureCampaignCommand.ChangeCanExecute(); 
     } 

     if (showAlert) 
     { 
      await page.DisplayAlert("Uh Oh :(", "Unable to load campaign.", "OK"); 
     } 
    } 

Dieses wird von einem Befehl aufgerufen:

public Command ConfigureCampaignCommand 
    { 
     get 
     { 
      return configureCampaignCommand ?? (configureCampaignCommand = new Command(async() => await ExecuteConfigureCampaignCommand(),() => { return !IsBusy; })); 
     } 
    } 

die sich von OnAppearing genannt wird:

protected override void OnAppearing() 
    { 
     base.OnAppearing(); 

     viewModel.ConfigureCampaignCommand.Execute(null); 
    } 

Die Logik ist in Ordnung - der Ansicht, dass ich erwarte jedoch geladen wird, das Netzwerk Aktivitäts-Spinner dreht sich weiter. Wenn ich eine Verzögerung von 1 Sekunde hinzufüge:

   Device.StartTimer(TimeSpan.FromMilliseconds(1),() => 
       { 
        MessagingService.Current.SendMessage<string>(SettingNames.NavigationSales, campaign); 

        return false; 
       }); 

Der Spinner stoppt, sobald die neue Ansicht geladen ist. Wenn ich die await Task.Delay's entferne, stoppt der Spinner, sobald die Ansicht geladen ist, jedoch sind die Lademeldungen für den Benutzer nicht sichtbar.

Meine Frage ist, warum fährt der Netzwerk-Spinner fort?

Antwort

0

Wenn Sie IsBusy ändern

OnPropertyChanged("IsBusy"); 

Wie Sie dies für Ihre andere Eigenschaften fordern, aber nicht für IsBusy Ich denke, dass dies wahrscheinlich der Grund, warum die Änderung nach oben geht nicht abgeholt.

+0

Ich verwende eine MVVM Helper-Bibliothek, die IsBusy definiert und OnPropertyChange ("IsBusy") aufruft. – markpirvine

+0

Wird ExecuteConfigureCampaignCommand im UI-Thread ausgelöst? – bradgonesurfing

+0

Ich nehme an, wir sprechen über diese Eigenschaft https://developer.xamarin.com/api/property/Xamarin.Forms.Page.IsBusy/ – bradgonesurfing

Verwandte Themen