2017-01-08 8 views
0

Jungs und Damen können Sie mir sagen, was für ein Problem in diesem Code oder auf welche Weise kann ich Xamarin Einstellungen für die erfolgreiche Ausführung von Code ändern? Xam.Plugin.Connectivity.CrossConnectivity sagt: "Gerät ist mit dem Internet verbunden", aber in jeder Realisierung DownloadCountriesListAsync() stecken (UWP funktioniert nicht, Android mit ausgewählten INTERNET-Parameter in Manifest auch). Dieser Code funktioniert in der C# -Konsolen-App.Xamarin.Forms mit Net.Http

using System; 
using System.Collections.Generic; 
using System.Net.Http; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace radacodeTestApp 
{ 
    public class ListsDownloader 
    { 
     public List<Country> Countries { get; private set; } 

     public ListsDownloader() 
     { 
      Countries = new List<Country>(); 
      var task = DownloadCountriesListAsync(); 
     } 

     public async Task<bool> DownloadCountriesListAsync() 
     { 
      try 
      { 
       var vkjsonResponse = await GetResponse(@"https://api.vk.com/api.php?oauth=1&method=database.getCountries&need_all=1&v=5.60"); 
       var jsonObject = JObject.Parse(vkjsonResponse); 
       foreach (var jO in jsonObject["response"]["items"]) 
        Countries.Add(JsonConvert.DeserializeObject<Country>(jO.ToString())); 

      } 
      catch (OperationCanceledException) 
      { 
       return false; 
      } 
      return true; 
     } 

     public async Task<string> GetResponse(string url) 
     { 
      using (var httpClient = new HttpClient()) 
       return await httpClient.GetStringAsync(url); 

     } 


    } 
    public class Country 
    { 
     public int Cid { get; set; } 
     public string Title { get; set; } 
     public override string ToString() 
     { 
      return Title; 
     } 
    } 
} 
+1

Sie sind nicht und kann nicht sein, warten auf sie beenden zu. Mach das nicht in einem Konstruktor. – SLaks

+0

Ich warte nicht auf Finish im Konstruktor. Schauen Sie genauer hin –

+0

Genau; das ist das Problem – SLaks

Antwort

0

Rufen Sie die DownloadCountriesListAsync Methode aus einem Hintergrundthread; Ihr Code ruft derzeit DownloadCountriesListAsync vom Haupt-Thread (auch UIThread genannt) an, was dazu führen kann, dass der UIThread einfriert.

Ich habe Ihren Code unten aktualisiert, um zu zeigen, wie die DownloadCountriesListAsync-Methode von einem Hintergrund-Thread aufgerufen wird.

Async/Warten ist ein schwieriges Biest. Das Markieren einer Methode async bedeutet nicht, dass sie automatisch auf einem Hintergrundthread ausgeführt wird. Das bedeutet nur, dass die async-Methode ihren Prozess bis zum Abschluss des Prozesses an den übergeordneten Thread übergeben kann. @Clancey hat eine großartige Präsentation über Async/Await auf der letzten Xamarin-Konferenz gemacht. Ich empfehle es sehr!

https://www.youtube.com/watch?v=jgxJbshvCXQ

using System; 
using System.Collections.Generic; 
using System.Net.Http; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace radacodeTestApp 
{ 
    public class ListsDownloader 
    { 
     public List<Country> Countries { get; private set; } 

     public ListsDownloader() 
     { 
      Countries = new List<Country>(); 
      Task.Run(async() => await DownloadCountriesListAsync()); 
     } 

     public async Task<bool> DownloadCountriesListAsync() 
     { 
      try 
      { 
       var vkjsonResponse = await GetResponse(@"https://api.vk.com/api.php?oauth=1&method=database.getCountries&need_all=1&v=5.60"); 
       var jsonObject = JObject.Parse(vkjsonResponse); 
       foreach (var jO in jsonObject["response"]["items"]) 
        Countries.Add(JsonConvert.DeserializeObject<Country>(jO.ToString())); 

      } 
      catch (OperationCanceledException) 
      { 
       return false; 
      } 
      return true; 
     } 

     public async Task<string> GetResponse(string url) 
     { 
      using (var httpClient = new HttpClient()) 
       return await httpClient.GetStringAsync(url); 
     } 
    } 

    public class Country 
    { 
     public int Cid { get; set; } 
     public string Title { get; set; } 
     public override string ToString() 
     { 
      return Title; 
     } 
    } 
} 
+1

Danke, Brandon –