2017-01-08 5 views
0

Ребята и дамы вы можете мне рассказать, в чем проблема в этом коде или каким образом я могу изменить настройки Xamarin для успешного выполнения кода? Xam.Plugin.Connectivity.CrossConnectivity говорит: «Устройство подключено к Интернету», но в любой реализации DownloadCountriesListAsync() stucks (UWP не работает, Android с выбранным параметром INTERNET в манифесте тоже). Этот код работает в консольном приложении C#.Xamarin.Forms с 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

Вы не, и не может быть, ждет его завершения. Не делайте этого в конструкторе. – SLaks

+0

Я не жду конца в конструкторе. Посмотрите ближе –

+0

Точно; это проблема – SLaks

ответ

0

Вызов метода DownloadCountriesListAsync из фоновой нити; ваш код в настоящее время вызывает DownloadCountriesListAsync из главной темы (также известный как UIThread), что может привести к зависанию UIThread.

Я обновил ваш код ниже, чтобы показать, как вызвать метод DownloadCountriesListAsync из фонового потока.

Async/Await - хитрый зверь. Маркировка метода async не означает, что он будет автоматически запускаться в фоновом потоке; это просто означает, что метод async имеет возможность довести свой процесс до его родительского потока, пока его процесс не будет завершен. @Clancey сделал отличную презентацию о Async/Await на самой последней конференции Xamarin. Я очень рекомендую!

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

Спасибо, Брэндон –