2016-04-02 34 views
1

Soundcloud API'sinden yanıt almaya çalışıyorum. İşte benim kodum.Xamarin Form HttpClient Stuck

public static async Task<string> GetTheGoodStuff() 
    { 
    var client = new HttpClient(new NativeMessageHandler()); 
    var response = await client.GetAsync("http://api.soundcloud.com/playlists?client_id=17ecae4040e171a5cf25dd0f1ee47f7e&limit=1"); 
    var responseString = response.Content.ReadAsStringAsync().Result; 
    return responseString; 
    } 

Ancak, var response = await client.GetAsync numaralı yuvada. Bunu nasıl düzeltebilirim?

Teşekkürler!

+0

'yeni NativeMessageHandler()' kodunuzu BTW yerine Result' kullanmak 'bloke ... benim için çalıştı' bekliyor response.Content.ReadAsStringAsync() ' – Eser

+0

PCL projede bu kodu çalıştırmayı denediniz ? – xevilboss

+0

@Eser OP'nin ModernHttpClient'i kullandığını düşünüyorum, bu yüzden PCL ve yerel projelerde referanslara gereksiniminiz var. –

cevap

1

Kodunuzu sadece bir PCL'de kullandım, değiştirdiğim tek şey iOS ATS gereksinimlerini karşılamak için url (https) ve bunu bir async yönteminden çağırdı. IOS cihazında iyi çalışır. PCL'de Microsoft.Net.Http ve PCL 'da ModernHttpClient ve platforma özel projelerde (NuGet aracılığıyla) referanslar aldım. Bazı PCL görmek model sınıfında

Kodunuz:

using System.Net.Http; 
using System.Threading.Tasks; 
using ModernHttpClient; 

public class ItemsViewModel 
{ 

... 

    public async Task<string> GetPlaylist() 
    { 
     // Use https to satisfy iOS ATS requirements. 
     var client = new HttpClient(new NativeMessageHandler()); 
     var response = await client.GetAsync("https://api.soundcloud.com/playlists?client_id=17ecae4040e171a5cf25dd0f1ee47f7e&limit=1"); 
     var responseString = await response.Content.ReadAsStringAsync(); 
     return responseString; 
    } 

... 

} 

Sonra başlatır ve görünümü modelinin bir örneğini kullanan bir PCL sayfa sınıfında: Bu yardımcı olur

public partial class ItemsPage : ContentPage 
{ 
    public ItemsPage() 
    { 
     InitializeComponent(); 
     Vm = new ItemsViewModel(); 
     BindingContext = Vm; 
    } 

    protected override async void OnAppearing() 
    { 
     var playlist = await Vm.GetPlaylist(); 
     // Do something cool with the string, maybe some data binding. 
    } 

    // Public for data binding. 
    public ItemsViewModel Vm { get; private set; } 
} 

Umut.

0

Kodumu değiştirdim ve şimdi çalışıyor. Ama biraz yavaş. Httpclient kullandığımda UI 1-2 saniye boyunca donuyor gibi görünüyor. Olmadan

public string TrackSearch(string whatFor) 
{ 
    HttpClient client = new HttpClient(); 
    Task<string> getStringTask = client.GetStringAsync(string.Format("https://api.soundcloud.com/tracks?client_id=17ecae4040e171a5cf25dd0f1ee47f7e&limit=15&q={0}", whatFor)); 
    return getStringTask.Result; 
} 
+2

UI iş parçacığını getStringTask.Result numaralı telefonu arayarak engellediniz HttpClient'in uyumsuzluk yöntemlerini kullanmak istiyorsanız, bekletme ifadeleriyle birlikte async yöntemlerini kullanmak daha iyidir. –