联系人搜索异步需要很长时间
本文关键字:长时间 搜索 异步 联系人 | 更新日期: 2023-09-27 18:15:22
我的问题是:我正在创建一个WP7应用程序,需要列出移动设备上的所有联系人。我知道有Contacts
类的方法SearchAsync
和SearchCompleted
事件处理程序。
除了一个细节之外,这一切都在工作;当我在手机上使用应用程序时,搜索时间超过12秒!我正在使用数据虚拟化来快速绘制UI。我手机里大概有400个联系人。所以问题是,SearchCompleted
是在很长一段时间后发射的:(
你有什么改进这个方案的想法吗?我应该开始在列表框中插入联系人的首字母("a","b"…但这意味着我需要调用SearchAsync反复),然后我怎么能合并它?
设备:Samsung Omnia 7
ThreadPool.QueueUserWorkItem(result =>
{
_cachingRunning = true;
var contacts = new Contacts();
contacts.SearchCompleted += contacts_SearchCompleted;
contacts.SearchAsync(string.Empty, FilterKind.None, null);
});
这个方法在SearchAsync
:
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上进行数据虚拟化时,通过Index和Count访问。
这个方法"工作"与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)如果后台代理太可怕,你可以在进程中完成所有这些。当用户打开应用程序时,后台线程可以收集联系人列表并将其保存到内部存储中。
虽然你需要花时间管理联系人的内部存储,但它允许你控制联系人列表,并且肯定会改善用户体验,因为他们会认为联系人搜索非常快。