【发布时间】:2015-11-09 15:09:12
【问题描述】:
我为“Windows Phone 8.1”开发了一个应用程序,我正在使用一个包含 4700 个项目的数据库。在“Windows Store App 8.1/10 (Desktop/Tablet)”应用程序运行速度很快,但“Windows Phone 8.1”可以看到“UI”运行缓慢且滞后。这里是性能分析器的分析。
当应用程序启动“OnLaunching”方法时,我将数据从 sqlite 存储库加载到静态类中的静态属性“IEnumerable”。
await Task.Run(async () =>
{
if (InstanceMessageService.AllHolidays == null)
{
InstanceMessageService.AllHolidays = _repository.GetAll();
InstanceMessageService.AllCountries = await Task.Run(() =>
InstanceMessageService.AllHolidays.GroupBy(holiday => holiday.Country)
.Select(x => x.First().Country)
.Select(s => new Country()
{
Title = s,
FirstLetter = s[0].ToString()
}).ToList()
);
if (!InstanceMessageService.AllHolidays.Any() || !InstanceMessageService.AllCountries.Any())
{
throw new Exception("Cannot load SQLite data");
}
}
});
这里是InstanceMessageService
public static class InstanceMessageService
{
public static IEnumerable<Holiday> AllHolidays { get; set; }
public static IEnumerable<Country> AllCountries { get; set; }
...
}
现在静态属性中包含 4700 个假日项目(在内存中)和国家/地区的 171 个项目。我认为这不是好方法。
这是我的 CalendarsPage 的 ViewModel 代码。 CalendarsPage 提供今天、明天或从日历控件中选择的具体日期的假期数据。
public class CalendarPageViewModel : INotifyPropertyChanged
public IEnumerable<Holiday> Holidays
{
get { return _holidays; }
set
{
_holidays = value;
OnPropertyChanged("Holidays");
}
}
public ObservableCollection<Holiday> TodayHolidays
{
get { return _todayHolidays; }
set
{
_todayHolidays = value;
OnPropertyChanged("TodayHolidays");
}
}
public ObservableCollection<Holiday> TomorrowHolidays
{
get { return _tomorrowHolidays; }
set
{
_tomorrowHolidays = value;
OnPropertyChanged("TomorrowHolidays");
}
}
public ObservableCollection<Holiday> SelectedDateHoliday
{
get { return _selectedDateHoliday; }
set
{
_selectedDateHoliday = value;
OnPropertyChanged("SelectedDateHoliday");
}
}
public CalendarPageViewModel()
{
Task task = InitCollections();
InitCommands();
}
**// Slowly magic here**
private async Task InitCollections()
{
Holidays = InstanceMessageService.AllHolidays;
TomorrowHolidays = new ObservableCollection<Holiday>(await Task.Run(() => Holidays.Where(holiday => holiday.Date == DateTime.Now.AddDays(1).Date.ToString("MMM d")).Select(holiday => holiday)));
TodayHolidays = new ObservableCollection<Holiday>(await Task.Run(() => Holidays.Where(holiday => holiday.Date == DateTime.Now.Date.ToString("MMM d")).Select(holiday => holiday)));
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
存储库类代码
public class HolidaysRepository : IRepository<Holiday>
{
private readonly IDatabaseConnection _databaseConnection;
public HolidaysRepository(IDatabaseConnection databaseConnection)
{
_databaseConnection = databaseConnection;
}
public List<Holiday> GetAll()
{
return _databaseConnection.Connection.Table<Holiday>().ToList();
}
public void AddOrUpdate(Holiday entity)
{
if (_databaseConnection.Connection.Table<Holiday>().FirstOrDefault(item => item.Id == entity.Id) !=
null)
{
Update(entity);
}
else
{
Add(entity);
}
}
public void Add(Holiday entity)
{
_databaseConnection.Connection.Insert(entity);
}
public void Update(Holiday entity)
{
_databaseConnection.Connection.Update(entity);
}
public void Delete(Holiday entity)
{
_databaseConnection.Connection.Delete(entity);
}
public void Clean()
{
_databaseConnection.Connection.DeleteAll<Holiday>();
}
}
这可能很重要,在应用程序中我使用“Ninject”作为“ServiceLocator”。
如何提高应用程序的速度?如何减少使用的 RAM 量?如果 4700 个元素使应用程序运行缓慢而 UI 运行缓慢,那么我认为 67,000 个项目将没有足够的 RAM。
【问题讨论】:
-
我认为您不想一次加载所有数据。为什么不只加载今天、明天和所选日期的假期。或者,如果您的应用具有月度视图,则只需加载上个月、当前月和下个月的数据。
-
感谢您的回复。我尝试这样做,但 UI 的速度并没有变得更快。也许我应该在加载数据时添加动画。也许 sqlite orm 变慢了?我没有使用干净的 sql 查询。谢谢
标签: c# sqlite windows-phone-8.1 windows-store-apps