[英]Contacts SearchAsync takes a long time
这是我的问题:我正在创建WP7应用程序,并且需要列出移动设备上的所有联系人。 我知道有使用方法SearchAsync
和SearchCompleted
事件处理程序的Contacts
类。
除了一个细节,所有这些工作都是可行的。 当我在手机上使用该应用程序时,搜索需要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)“配合使用”并创建ViewModel项,该项将添加到VirtualizingDataCollection
。
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;
}
如果这是芒果设备,则有两种选择:
1)使用后台任务将联系人信息推送到特定于应用程序的数据存储中。 标准后台任务每30分钟运行一次,大约需要30秒才能执行。 可以在这里找到有关后台代理的更多信息: 后台代理
2)如果后台代理太吓人,则可以在过程中完成所有这些操作。 当用户打开应用程序时,后台线程可以收集联系人列表并将其保存到内部存储中。
尽管您需要花费时间来管理联系人的内部存储,但它使您可以控制联系人列表,并且肯定会改善用户体验,因为他们认为联系人搜索非常快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.