2017-06-08 5 views
0

Ich erstellte eine Klasse, die mit der API verbunden, um die erforderlichen Daten mit httpclient abrufen. Diese Datei wurde im Code hinter der Datei der Ansicht aufgerufen und funktionierte perfekt. Dann habe ich beschlossen, den MVVM-Ansatz zu implementieren. Daher habe ich den Code, der die Restdienstklasse initialisiert hat, in das Ansichtsmodell verschoben. Danach habe ich aufgehört, die Daten zu bekommen. Um dies zu untersuchen, habe ich die Debugging-Sitzung mit dem Breakpoint an der Zeile angegeben, an der ich die Rest-Service-Klasse initialisiere. Dann habe ich diese Zeile ausgeführt. Dadurch habe ich herausgefunden, dass eine große android Mono-Ausnahme ausgelöst wird und die Debugging-Sitzung gestoppt wird. Die App beendet die Debugging-Sitzung. Dies ist zum ersten Mal seit meiner Entwicklung meiner App in Xamarin Forms passiert. Ich habe keine Ahnung, warum es so bricht. Ihre Hilfe wird sehr geschätzt.Xamarin Forms - Anruf Rest Service von ViewModel von pcl

Dies ist der Code, der ordnungsgemäß funktionierte. Nach Ansicht Code hinter Datei

[XamlCompilation(XamlCompilationOptions.Compile)] 
public partial class SubtaskPage : ContentPage 
{ 
    protected override void OnAppearing() 
    { 
     base.OnAppearing(); 
     PopulateSubtaskData(); 
    } 
    private async void PopulateSubtaskData() 
    { 
     lstSubtasks.IsRefreshing = true; 
     try 
     { 
      RestService rs = new RestService(); 
      SResponse = await rs.GetSubtasksAsync(Convert.ToInt32(Application.Current.Properties["UserId"])); 
      if (SResponse.Status == 1) 
      { 
       lstSubtasks.ItemsSource = SResponse.Subtasks; 
      } 
      else 
      { 
       await DisplayAlert("Error", SResponse.Message, "Ok"); 
      } 
     } 
     catch (Exception E) 
     { 
      Debug.WriteLine(@"GetSubtasksAsync -> ERROR {0}", E.Message); 
     } 
     lstSubtasks.IsRefreshing = false; 
    } 
} 

Der Rest Serviceklasse ist wie folgt diese Klasse in einem separaten Ordner namens "Service". IP und URL wurden aus Sicherheitsgründen geändert.

class RestService 
{ 
     HttpClient client; 
     public List<Ticket> Tickets { get; private set; } 
     string Server1 = "server ip"; 
     string Server2 = "server ip"; 
     public RestService() 
     { 
      client = new HttpClient(); 
      client.MaxResponseContentBufferSize = 256000; 
     } 
     public async Task<SubtasksResponse> GetSubtasksAsync(int UserId) 
     { 
      SubtasksResponse SubtaskResponse = new SubtasksResponse(); 
      string ApiUrl = "URL"; 
      string Url = ""; 
      HttpResponseMessage response; 
      if (CrossConnectivity.Current.IsConnected) 
      { 
       Url = await GetActiveServerAsync(); 
       if (Url != "") 
       { 
        var uri = string.Format(Url + ApiUrl, UserId); 
        try 
        { 
         response = await client.GetAsync(uri); 
         if (response.IsSuccessStatusCode) 
         { 
          var content = await response.Content.ReadAsStringAsync(); 
          SubtaskResponse.Subtasks = JsonConvert.DeserializeObject<List<Ticket>>(content); 
          SubtaskResponse.Status = 1; 
         } 
         else 
         { 
          SubtaskResponse.Subtasks = null; 
          SubtaskResponse.Status = 0; 
          SubtaskResponse.Message = "Attempt to fetch data from server was unsuccessful. Please try again"; 
         } 
        } 
        catch (Exception E) 
        { 
         SubtaskResponse.Subtasks = null; 
         SubtaskResponse.Status = 0; 
         SubtaskResponse.Message = "Error occured while fetching data from the server. Please try again"; 
        } 
       } 
       else 
       { 
        SubtaskResponse.Subtasks = null; 
        SubtaskResponse.Status = 0; 
        SubtaskResponse.Message = "Remote Server Not Responding! Please try again later"; 
       } 
      } 
      else 
      { 
       SubtaskResponse.Subtasks = null; 
       SubtaskResponse.Status = 0; 
       SubtaskResponse.Message = "No Network Connection Found! Please connect to a network and try again"; 
      } 
      return SubtaskResponse; 
     } 
    } 
} 

Das funktionierte gut, bis ich das Ansichtsmodell in den Mix fügte. So rufe ich die Funktion im View-Modell auf.

async Task<SubtasksResponse> PopulateSubtaskList() 
{ 
    RestService rs = new RestService(); 
    IsBusy = true; 
    _subtaskList = await rs.GetSubtasksAsync(Convert.ToInt32(Application.Current.Properties["UserId"])); 
    IsBusy = false; 
    return _subtaskList; 
} 

"RestService rs = new RestService();" Dies ist die Zeile, in der der Code bricht.

Hier ist das Bild der Ausnahme, die auftritt, wenn der Code bricht. enter image description here

Ich hoffe, Sie bekommen ein klares Bild der Situation. Bitte lassen Sie mich wissen, wenn zusätzliche Informationen benötigt werden. Danke

+0

Es wäre toll, wenn Sie Code teilen könnten, was immer Sie bisher versucht haben. Damit diese Gemeinschaft Ihnen besser helfen kann. – Yogesh

+3

Sie müssen den Code, der die Ausnahme erzeugt, und die Ausnahme selbst zu Ihrer Frage – SushiHangover

+0

hinzufügen: https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/ – Pratik

Antwort

0

Die Antwort auf dieser Seite gefunden (https://releases.xamarin.com/common-issues-in-the-xamarin-15-2-2-release-being-tracked-by-the-xamarin-team/).

Die Lösung ist wie folgt

  1. die fehlende Mono.Posix Datei herunterladen und das Archiv entpacken.
  2. Klicken Sie mit der rechten Maustaste auf die Datei Mono.Posix.dll im Explorer, und wählen Sie Eigenschaften.
  3. Überprüfen Sie die Registerkarte Digitale Signaturen, um sicherzustellen, dass die Datei eine gültige Signatur von Xamarin Inc. enthält.
  4. Aktivieren Sie am unteren Rand der Registerkarte Allgemein das Kontrollkästchen Entsperren, und wählen Sie OK. (Dieses Kontrollkästchen hängt davon ab, wie die Datei heruntergeladen wurde.)
  5. Kopieren Sie für Visual Studio 2017 die Datei Mono.Posix.dll in das Erweiterungsverzeichnis "Xamarin.VisualStudio".Bei einer Standardinstallation der Enterprise-Edition kopieren Sie die Datei beispielsweise in: C: \ Programme (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ Erweiterungen \ Xamarin.VisualStudio
  6. Für Visual Studio 2015, kopieren Sie die Datei in das Erweiterungsverzeichnis "Xamarin \ Xamarin": C: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Erweiterungen \ Xamarin \ Xamarin \
  7. Beenden Sie Visual Studio und starten Sie es neu.

Für weitere Informationen, besuchen Sie den oben angegebenen Link.

0

Tun Sie dies nicht. Wenn Sie Ruhe aus einer mvvm Xamarin Forms App anrufen möchten, kann ich Refit empfehlen. All die schwierige Arbeit ist bereits für dich erledigt und abstrahiert. Mit ein paar Zeilen Code sind Sie am Laufen.

+0

Die API, die ich verwende, ist in PHP geschrieben. –

+0

es ist egal mit dem, was die api, die Sie anrufen, geschrieben wird, solange es ein Rest Service ist, können Sie Refit verwenden – Moorlang

0

BTW die Fehlermeldung, die Sie zeigen, hat wahrscheinlich nichts mit Ihrem Code zu tun, sondern ist ein Fehler in einer aktuellen Xamarin-Version. Siehe hier: https://bugzilla.xamarin.com/show_bug.cgi?id=56787

+0

Das Problem ist immer noch nicht in Xamarin Formen behoben –

+0

Das Problem wurde durch die Lösung in der gegeben dies [link] (https://releases.xamarin.com/common-issues-in-the-xamarin-15-2-2-release-being-by-the-xamarin-team/). Dies wurde in der obigen Bugzilla-Verknüpfung erwähnt. –

Verwandte Themen