HttpClient очень медленно работает - Xamarin Forms - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь загрузить JSON из URL.Я отлаживаю приложение через свое устройство Samsung, но по какой-то причине httpclient загружает данные очень долго.

Когда я устанавливаю время ожидания с помощью TimeSpan.FromMinutes (30), httpclient занимает очень много времени, что практически невозможно.Однако, когда я удаляю тайм-аут, я получаю исключение TaskCancelled, которое ловит блок try catch.

Кто-нибудь видел такое раньше?

Пробовал проверять разрешения: Единственное разрешение, которое требуется приложению, этоИнтернет, который по умолчанию предоставляется в режиме отладки.

Любая помощь будет оценена.Спасибо!


Редактировать

Этот класс отвечает за загрузку данных:

 public static class DataSource
    {
        public async static void LoadFrom()
        {
               var uri = new Uri("https://api.coinmarketcap.com/v2/ticker/?convert=usd&sort=price");    
            try
            {
                bool isConnected = CrossConnectivity.Current.IsConnected;
                HttpClient myClient = new HttpClient(new Xamarin.Android.Net.AndroidClientHandler());
                var response = await myClient.GetAsync(uri);
                if (response.IsSuccessStatusCode)
                {
                    var Data = await response.Content.ReadAsStringAsync();
                    var CoinMarketCapObject = JsonConvert.DeserializeObject<CoinMarketCap.CoinMarketCapCurrencyData>(Data);
                    List<Currency> currencies = new List<Currency>();
                    if (CoinMarketCapObject != null)
                    {
                        foreach (var Datum in CoinMarketCapObject.Data)
                        {
                            currencies.Add(new Currency(Datum.Value.name, Datum.Value.symbol, Datum.Value.quotes.USD.price));
                        }
                    }
                }
            }
            catch (TimeoutException ex)
            {
                // Check ex.CancellationToken.IsCancellationRequested here.
                // If false, it's pretty safe to assume it was a timeout.
            }
            catch (TaskCanceledException ex)
            {
                // Check ex.CancellationToken.IsCancellationRequested here.
                // If false, it's pretty safe to assume it was a timeout.
            }
            catch (Exception e)
            {
                Debug.Print(e.Message);

            }
        }

    }

Я вызываю метод LoadFromиз метода OnStart.

protected override void OnStart ()
        {
            // Handle when your app starts
            API.DataSource.LoadFrom();
        }

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я подозреваю, что вы используете HttpClientHandler.Текущая рекомендация от Xamarin - использовать AndroidNativeHandler.Он использует собственный сетевой стек Android и поддерживает шифрование, а не виртуализируется в среде выполнения .NET.Тем не менее, компромиссы поддерживаются только с Android 5 и выше, а некоторые функции / опции HttpClient недоступны.

https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/http-stack

0 голосов
/ 27 мая 2018

Протестировано на Huawei P9 Lite ==> несколько секунд, чтобы получить результат ...

public async void LoadFrom()
{
    var uri = new Uri("https://api.coinmarketcap.com/v2/ticker/?convert=usd&sort=price");
    try
    {
        HttpClient myClient = new HttpClient();
        var response = await myClient.GetStringAsync(uri);
        Console.WriteLine(response);
    }
    catch (TimeoutException ex)
    {
        // Check ex.CancellationToken.IsCancellationRequested here.
        // If false, it's pretty safe to assume it was a timeout.
    }
    catch (TaskCanceledException ex)
    {
        // Check ex.CancellationToken.IsCancellationRequested here.
        // If false, it's pretty safe to assume it was a timeout.
    }
    catch (Exception e)
    {

    }
}

Возможно, у вашего микклиента есть некоторые проблемы ... или, возможно, проблема с сетью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...