Xamarin Forms: медленный httpclient и доступ к базе данных - PullRequest
0 голосов
/ 28 мая 2019

Xamarin Forms новичок здесь:)

Хорошо, вот и сделка.Я создал собственное приложение Android + Kotlin, в котором используются некоторые компоненты SDK (LiveData, ViewModel, Room) и другие полезные функции (dagger2), и оно работает просто отлично.

Я пытался перенести это приложение в формы Xamarin, чтобы я также мог получить версию для iOS.Несмотря на то, что мне удалось воспроизвести пользовательский интерфейс, у меня возникли некоторые проблемы с веб-службами и доступом к базе данных: оба они действительно очень медленные!Гораздо медленнее, чем результаты, которые я получал при использовании kotlin!

Например, в то время как в kotlin вызов локального веб-сервиса не был бы длиннее нескольких миллисекунд, в xamarin это занимает несколько секунд!Вот код, который я использую:

public class NewsService : INewsService {
    private const string _url = "https://...";
    private readonly HttpClient _client;
    public NewsService(HttpClient client) {
        _client = client;
    }
    public async Task<IEnumerable<DbNews>> GetAllNewsAsync() {
        try {
            var response = await _client.GetAsync(_url);
            if (!response.IsSuccessStatusCode) {
                // TODO: log here instead of throwing?
                throw new Exception("An error occurred during web service call.");
            }

            var responseText = await response.Content.ReadAsStringAsync();
            var newsList = JsonConvert.DeserializeObject<IEnumerable<DbNews>>(responseText);
            return newsList;
        }
        catch (Exception ex) {
            Debug.Fail(ex.ToString());
            return Enumerable.Empty<DbNews>();
        }
    }
}

Я использую DI с autofac.HttpClient регистрируется как одноэлементный:

containerBuilder.Register(c => SetupDefaultHttpClient())
                        .As<HttpClient>()
                        .SingleInstance();

SetupDefaultHttpClient - это простой помощник, который устанавливает заголовок авторизации (базовая аутентификация).Я уже проверил настройки проекта Android и похоже, что он настроен на использование встроенного обработчика:

enter image description here

Еще одна болевая точка - доступ к БД:это также намного медленнее, чем в приложении kotlin.С kotlin я использовал Room.С формами Xamarin я использую SQLite.net .Отображения действительно просты: мы говорим об объекте с примитивными свойствами (string, ints, datetime), которые непосредственно отображаются в столбцы существующей таблицы.

Вот код, который я написал для обновления новостей в локальной базе данных (он запускается после вызова веб-службы):

public async Task<IEnumerable<SimplifiedNews>> UpdateNewsListAsync(IEnumerable<DbNews> news) {
    if (!news?.Any() ?? true) {
        return Enumerable.Empty<SimplifiedNews>(); // empty collection do nothing
    }

    await _db.RunInTransactionAsync(cnn => {
                                        try {
                                            cnn.DeleteAll<DbNews>();
                                            cnn.InsertAll(news,
                                                          typeof(DbNews));
                                            cnn.Commit();
                                        }
                                        catch (Exception ex) {
                                            Debug.WriteLine(ex);
                                        }

                                    });
    var simplifiedNews = news.Select(n => n.ToSimplifiedNews())
                             .ToList();
    return simplifiedNews;
}

Проблема в том, что данные, сохраненные вбаза данных должна быть обновлена ​​(если это возможно) при запуске приложения.Поскольку это означает вызов веб-службы и сохранение ее в локальной базе данных, пользовательский опыт в конечном итоге оказывается очень плохим!(заставка отображается в течение нескольких секунд, прежде чем отображается главная страница - я изменил загрузку на заставку, чтобы пользователь не смотрел пустую страницу в течение нескольких секунд)

Я делаючто-то здесь не так?Любые советы о том, как исследовать эти проблемы?Я имею в виду, может ли что-нибудь сделать вызов веб-службы более медленным в формах xamarin, чем в приложении kotlin?Как я могу исследовать такого рода проблемы?

Спасибо.

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