2

这是一个使用 Xamarin 的 Android 应用程序。

我有一个简单的搜索屏幕,用户可以在其中选择根据州、城市、州际等(1 个或多个选项)进行过滤。当状态改变时,其他下拉列表会相应地改变(基于该州存在的城市或州际公路等)。每次更改状态下拉列表以更新其他下拉列表时,都需要 2 秒或更长时间,同时 UI 没有响应。我还注意到 RaisePropertyChanged 事件直到 set 方法中的所有代码都完成后才真正发生。如何加快速度以提供更好的用户体验?

这是缓慢的 SQL 调用。我正在寻找基于父属性的子对象列表。

        var parentIds = _connection.Table<Parent>().Where(x => x.State == state).Select(x => x.Id);
        return _connection.Table<Child>()
                          .Where(x => parentIds.Contains(x.ParentId))
                          .Select(x => x.ChildProperty)
                          .OrderBy(x => x)
                          .Distinct();
4

2 回答 2

2

通过所有优化,“首先测量,然后优化”。

当您说某事非常慢时,请确定是什么。是UI重绘吗?它是一个特定的 SQLite 调用吗?它是一个特定的线程交互。

一旦你确定了什么是慢的,那么你可以使用一些技术:

  • 将各种缓慢的东西放在后台非 UI 线程上
  • 虚拟化内存加载(因此您不必加载整个大列表)
  • 将数据缓存在内存中,这样您就不必每次都访问数据库
  • 向大型数据库(或内存存储)添加更多索引

但是所有这些想法都应该在测量之后出现(根据我的观点和经验),否则你很容易最终优化错误的东西。

于 2013-07-17T15:51:50.013 回答
1

解决方案是将查询更改为以下内容:

        var parentIds = _connection.Table<Parent>().Where(x => x.State == state).Select(x => x.Id).ToList();
        var children = _connection.Table<Child>().ToList();
        return
            children.Where(x => parentIds.Contains(x.ParentId))
                    .Select(x => x.ChildProperty)
                    .OrderBy(x => x)
                    .Distinct();
于 2013-07-17T16:32:03.363 回答