Android, Xamarin Formularios PCL, PortableRest PCL y Async Web Api Call

Estoy intentando utilizar PortableRest para hacer una llamada asíncrona a un Web API 2.2 Servicio de descanso de Xamarin Forms.

Creo que tengo algún tipo de problema de deadlock / synchronisationcontext pero no puedo resolverlo (newbie a async etc).

Alguien puede ayudarme porfavor?

Mi método de prueba del controlador (eliminado cualquier llamada a la base de datos)

public IEnumerable<ContentModel> GetTestRest() { return new List<ContentModel> { new ContentModel() {Categoryid = 1, Title = "Title"}}; } 

Mis pases de prueba de unidad –

 [TestMethod] public async Task TestRest() { MyNewsApiClient MyNewsApiClient = new MyNewsApiClient(); var models = await MyNewsApiClient.TestRest(); int count = models.Count; Assert.AreEqual(1, count); } 

Mi método de proxy portátil (PCL)

 public async Task<List<ContentModel>> TestRest() { var request = new RestRequest(); request.Resource = "Content/GetTestRest"; return await ExecuteAsync<List<ContentModel>>(request); } 

Formularios Xamarin ContentPage (PCL) –

 public partial class NewsType1CP : ContentPage { public NewsType1CP () { InitializeComponent (); } protected override void OnAppearing () { LoadData (); // this is a sync call of an async method, not sure how else to approach, make OnAppearing async? } public async Task LoadData () { Debug.WriteLine ("LoadData"); HeaderLabel.Text = "Load Data!"; MyNewsApiClient api = new MyNewsApiClient (); var cm = await api.TestRest (); // this will work on its own, control returns to this method - await api.GetDelay (); HeaderLabel.Text = "After! - "; NewsListView.ItemsSource = cm; } } 

La espera de api.TestRest () nunca resulta en HeaderLabel.After o ListView que se está estableciendo.

Si acabo de agregar una prueba Proxy Method GetDelay () que no llama a PortableRest a través de return esperamos ExecuteAsync> (request);

 public async Task<bool> GetDelay () { await Task.Delay (1000); return true; } 

Entonces todo "trabaja".

Gracias por su ayuda, voy a descargar el código fuente para PortableRest si es necesario (utilizando Nuget dll en la actualidad), simplemente no estaba seguro si falta algo básico en este nivel superior.

One Solution collect form web for “Android, Xamarin Formularios PCL, PortableRest PCL y Async Web Api Call”

Bien, esto finalmente no tiene nada que ver con Async (o cualquier problema con PortableRest), pero pensé que compartiría en caso de que pueda ayudar a otros.

Finalmente, poner un bloque try (obvio paso siguiente ahora!) Y capturó esta excepción –

Método no encontrado: 'System.Net.Http.HttpClientHandler.set_AutomaticDecompression'.

Así que, mirando esto –

http://davidburela.wordpress.com/2013/07/12/error-when-using-http-portable-class-library-compression/

PortableRest ya estaba en mi PCL de formularios, pero necesitaba agregar las bibliotecas de clientes Http de Microsoft Nuget a mi aplicación de Android.

Entonces conseguí –

Error: ConnectFailure (La dirección solicitada no es válida en este contexto)

Pensé que puede ser algo que ver con los permisos de Android, pero no fue en este caso (aunque ahora me doy cuenta de que tengo que añadir el permiso de Internet de todos modos para futuras llamadas).

Debido a que estoy ejecutando mi aplicación en una VM (de GenyMotion / Virtual Box), la aplicación para Android no puede acceder a LocalHost (donde reside mi Api Web)

Así pues, de esto –

http://bbowden.tumblr.com/post/58650831283/accessing-a-localhost-server-from-the-genymotion

Puedo confirmar que el uso de la dirección mostrada en VirtualBox> Archivo> Preferencias> Red> VirtualBox Host-Only Network Adapter> Modify hace el trabajo maravillosamente.

Gracias por tu ayuda.

  • Error de "renderizador de diseño" en xamarin
  • Visual Studio no puede depurar la aplicación de Android Xamarin
  • Problemas de recursos de Android después de actualizar a Xamarin Forms 2.0
  • El botón de Android muestra diferentes mensajes de Toast dependen del número de clics
  • Xamarin Android EditarTexto ingresar clave
  • Esperando separador de ruta de clase ';' Antes de '\ Android \ android-sdk \ build-tools \ 23.0.1 \ lib \ shrinkedAndroid.jar' en el argumento número 8
  • Java.IO.ISerializable Xamarin
  • No se puede convertir de int a Android.Graphics.Color
  • Xamarin Forms PCL HttpClient lanzando una excepción no controlada en Android
  • ¿Puedo diseñar la interfaz de usuario en Xamarin.Forms mediante XAML
  • Xamarin.Forms SetHasNavigationBar causas falsas salto en PushAsync
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.