Xamarin形式:httpclient和数据库访问缓慢

时间:2019-05-28 17:44:31

标签: android performance xamarin.forms

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项目的设置,看起来它已经设置为使用本机处理程序:

enter image description here

另一个麻烦点是访问数据库: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应用程序中慢?我该如何调查这类问题?

谢谢。

0 个答案:

没有答案