Xamarin在这里形成初学者:)
好的,这是交易。我已经构建了一个本地Android + Kotlin应用程序,该应用程序使用了一些sdk组件(LiveData,ViewModel,Room)和其他功能(dagger2),并且运行良好。
我一直试图将此应用程序移植到Xamarin Forms中,以便也可以获取iOS版本。即使我设法重现了UI,但Web服务和数据库访问仍存在一些问题:两者都非常慢!比使用kotlin时获得的结果要慢得多!
例如,在kotlin中调用本地Web服务不会超过几毫秒,而在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项目的设置,看起来它已经设置为使用本机处理程序:
另一个麻烦点是访问数据库:kotlin应用程序中的访问速度也慢得多。和kotlin一起使用Room。对于Xamarin Forms,我正在使用SQLite.net。映射非常简单:我们谈论的是具有原始属性(字符串,整数,日期时间)的对象,这些属性直接映射到现有表的列中。
这是我为更新本地数据库中的新闻而编写的代码(在调用Web服务后运行):
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;
}
这里的问题是,运行该应用程序时应刷新(如果可能)数据库中保存的数据。由于这意味着调用Web服务并将其保存在本地数据库中,因此最终导致用户体验非常糟糕! (在呈现主页之前,初始屏幕会显示几秒钟-我已更改了初始屏幕的加载方式,以便用户在几秒钟内都不会盯着空白页)
我在这里做错什么了吗?有关如何调查这些问题的任何提示?我的意思是,在xamarin表单中,是否有什么方法会使调用Web服务的速度比在kotlin应用程序中慢?我该如何调查这类问题?
谢谢。