这是我的问题:我正在创建一个WP7应用程序,需要列出移动设备上的所有联系人。我知道Contacts
类包含方法SearchAsync
和SearchCompleted
事件处理程序。
除了一个细节外,这一切都有效;当我在手机上使用该应用程序时,搜索时间超过12秒!我正在使用数据虚拟化来快速绘制UI。我的手机里有大约400个联系人。所以问题是,SearchCompleted
在很长一段时间后被解雇:(
您对如何改进此解决方案有任何想法吗?我应该开始在列表框中按首字母插入联系人(“a”,“b”......但这意味着我需要重复调用SearchAsync)然后我该如何合并呢?
设备:三星Omnia 7
ThreadPool.QueueUserWorkItem(result =>
{
_cachingRunning = true;
var contacts = new Contacts();
contacts.SearchCompleted += contacts_SearchCompleted;
contacts.SearchAsync(string.Empty, FilterKind.None, null);
});
此方法在SearchAsync
之后差不多12秒调用:
private void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
{
_phoneContacts = e.Results;
Count = e.Results.Count();
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
Cached = true;
_cachingRunning = false;
CachingChanged();
});
}
我存储_phoneContacts
然后用它进行过滤;在ListBox上的数据虚拟化期间通过索引和计数访问它。
此方法与VirtualizingDataCollection
(Telerik)“一起使用”并创建添加到VirtualizingDataCollection
的ViewModel项。
public ObservableCollection<ExtendedContactModel> GetContactsRange(int startIndex, int count)
{
var collection = new ObservableCollection<ExtendedContactModel>();
for (var i = startIndex; i < startIndex + count; i++)
{
var vo = ConvertToVO(_phoneContacts.ElementAt(i));
var newContact = ConvertToExtendedContactModel(_phoneContacts.ElementAt(i), vo);
collection.Add(newContact);
}
return collection;
}
答案 0 :(得分:0)
如果这是一个芒果设备,你有几个选择:
1)使用后台任务将联系人信息推送到特定于应用程序的数据存储中。标准后台任务每30分钟运行一次,大约需要30秒才能执行。有关后台代理的更多信息,请访问:Background Agents
2)如果后台代理太吓人了,你可以在进程中完成所有这些操作。当用户打开应用程序时,后台线程可以收集联系人列表并将其保存到内部存储。
虽然您需要花时间管理联系人的内部存储,但它允许您控制联系人列表,并且肯定会改善用户体验,因为他们认为联系人搜索速度非常快。