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.
Ich hoffe, Sie bekommen ein klares Bild der Situation. Bitte lassen Sie mich wissen, wenn zusätzliche Informationen benötigt werden. Danke
Es wäre toll, wenn Sie Code teilen könnten, was immer Sie bisher versucht haben. Damit diese Gemeinschaft Ihnen besser helfen kann. – Yogesh
Sie müssen den Code, der die Ausnahme erzeugt, und die Ausnahme selbst zu Ihrer Frage – SushiHangover
hinzufügen: https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/ – Pratik