[英]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.