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](https://i.stack.imgur.com/4p9Th.png)
Еще одна болевая точка - доступ к БД:это также намного медленнее, чем в приложении 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?Как я могу исследовать такого рода проблемы?
Спасибо.