我嘗試加載聯繫人列表時出現性能問題。 這是代碼:android聯繫人列表性能
public ContactList getContacts(String constraint)
{
ContactList contactList = new ContactList();
Uri uri = ContactsContract.Contacts.CONTENT_URI;
if (constraint != null && constraint.equals("") == false)
{
uri = Uri.withAppendedPath(
ContactsContract.Contacts.CONTENT_FILTER_URI, constraint);
}
ContentResolver cr = _context.getContentResolver();
String sortOrder = DISPLAY_NAME + " COLLATE LOCALIZED ASC";
// Cursor cur = cr.query(uri, null, null, null, sortOrder);
String[] arrayOfString = new String[1];
arrayOfString[0] = "1";
Cursor cur = cr.query(uri, null, "has_phone_number=?", arrayOfString,
sortOrder);
if (cur.getCount() > 0)
{
setBaseContactList(contactList, cur);
}
cur.close();
return contactList;
}
private void setBaseContactList(ContactList contactList, Cursor cur)
{
String id;
String name;
String lookUpKey;
String photoId;
while (cur.moveToNext())
{
id = cur.getString(cur.getColumnIndex(DISPLAY_ID));
name = cur.getString(cur.getColumnIndex(DISPLAY_NAME));
photoId = cur.getString(cur.getColumnIndex(PHOTO_ID));
lookUpKey = cur.getString(cur.getColumnIndex(LOOKUP_KEY));
Contact c = new Contact(id, name, photoId, lookUpKey);
contactList.addContact(c);
}
}
看着traceview我可以看到 cur.getString(cur.getColumnIndex( 「一些列名」)); 正在它的加載時間收費
同時使用traceview,我可以看到的另一件事是,有很多召喚到方法
String.equalsIgnoreCase()
我的猜測是,cur.getString呼籲它。
林想着把那些發起的onCreate的所有值()在HT(的ContactID,聯繫方式),然後要求他們從每一個接觸後選擇使用提取的用戶ID分貝。 我會減少3次,這是可能的好,但有更好的解決方案?
感謝
我按照您的指示。指的是: '雖然這很明顯,但我仍然會問客戶類是否輕量級,以及它什麼都不做,只是初始化其成員。此外,該ContactList的addContact方法只是將其他項目添加到其包裝或擴展列表。 ' 正如你所說 - 輕量級。 但是,按照您的建議,我需要花費大量時間來創建列表爲46毫秒。我添加traceview分析可能這可能有所幫助。 [traceview](http://s16.postimage.org/6bu3zz9g5/image.jpg)。 –
對不起,但我無法從您的轉儲中獲得任何相關信息,只顯示創建聯繫人列表(根據您的標記)花費的時間以及繪圖過程中花費的時間。你正在畫什麼或在之後? 另一方面,如果您可以避免在每次迭代中創建新對象(不要使用關鍵字「new」),它會爲您節省更多cpu週期 – amirlazarovich