2016-04-07 5 views
1

Ich benutze RESTESHARP zum Abrufen von Daten von einer API, die ich mache, möchte ich eine Klasse namens "ApiInterface", die in Xamarin (Android, iOS , Windows ...), um die API aufzurufen.RestSharp on Response weiß nicht, wie man Callback ruft

Diese Klasse hat ihren RestClient und Funktionen, die von jedem Teil des Codes aufgerufen werden, da es ein Singleton ist.

Also zum Beispiel werde ich eine MainActivity.cs so etwas haben. (Aufruf meiner getData-Funktion und Ausführen von Daten mit den Daten, die ich erhalten habe).

Button buttonListaIntereses = FindViewById<Button> (Resource.Id.myButton); 

buttonListaIntereses.Click += delegate { 
    ApiInterface.Instance.getData(response2=> 
    { 
     Intent displayMessage = new Intent(this, typeof(DisplayMessage)); 
     //Put info in Extra for the new screen. 
     displayMessage.PutExtra("content", response2.Content); 
     StartActivity(displayMessage); 
    }); 
}; 

Aber in der APIInterface würde ich gemeinsame Daten wie Cookies erfahren möchten.

public async void getData(Action <IRestResponse> onDone) 
{   
    RestRequest request = new RestRequest("getData", Method.GET); 

    //Execute ASYNC the rest request 
    m_Client.ExecuteAsync (request, response => 
    { 
     //Do my stuff with headers. 
     string lCookie = response.Headers.ToList().Find(x => x.Name == "Cookie").Value.ToString(); 
     //Execute the OnDone 
     onDone(); 
    }); 
} 

Mein Problem ist, dass ich bin nicht sicher, wie meine ondone im getData und/oder wie auszuführen, um die getData Funktion aufzurufen.

Danke!

Antwort

2

ich verwenden Rückrufe wegbewegen und die Vorteile der Async/Await Features von C#

buttonListaIntereses.Click += async delegate { 
    var response = await ApiInterface.Instance.getData(); 
    LaunchResponseActivity(response); 
}; 

public void LaunchResponseActivity(IRestResponse response) 
{ 
    Intent displayMessage = new Intent(this, typeof(DisplayMessage)); 
    //Put info in Extra for the new screen. 
    displayMessage.PutExtra("content", response.Content); 
    StartActivity(displayMessage); 
} 

public async Task<IRestResponse> getData() 
{   
    RestRequest request = new RestRequest("getData", Method.GET); 

    var cancellationTokenSource = new CancellationTokenSource(); 

    var restResponse = await client.ExecuteTaskAsync(request, cancellationTokenSource.Token); 

    //Do my stuff with headers. 
    string lCookie = restResponse.Headers.ToList().Find(x => x.Name == "Cookie").Value.ToString(); 

    return restResponse; 
} 
+0

Hallo Andrés, ich habe nicht versucht, Sie Code, ich bin neu mit den async/erwarten C# Funktionen, was sind ihre Vorteile? – Chopi

+0

Sie waren es besser, die gesamte Schnittstelle für Xamarin und seinen Navigationsfluss zu ändern. – Chopi

1

Der Aktionsparameter ondone nimmt einen Parameter vom Typ IRestReponse:

public async void getData(Action<IRestResponse> onDone) 
{   
    RestRequest request = new RestRequest("getData", Method.GET); 

    //Execute ASYNC the rest request 
    m_Client.ExecuteAsync (request, response => 
    { 
     //Do my stuff with headers. 
     string lCookie = response.Headers.ToList().Find(x => x.Name == "Cookie").Value.ToString(); 

     // Execute the onDone action with the received response 
     onDone(response); 
    }); 
} 
+0

nehmen würde Danke Lenkan! Ich war damit fest! :) – Chopi

Verwandte Themen