0

我嘗試加載聯繫人列表時出現性能問題。 這是代碼: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次,這是可能的好,但有更好的解決方案?

感謝

回答

2

在@wildhemp建議的內容之上,我也會嘗試查詢特定的列,而不是爲所有列傳遞「null」。我還會檢查如果我從硬編碼索引中提取值(不是最佳實踐,但可能會加快處理速度),會節省多少週期。

例如:

Cursor cur = cr.query(uri, 
         new String[] {DISPLAY_ID, DISPLAY_NAME, PHOTO_ID, LOOKUP_KEY}, 
         "has_phone_number=?", arrayOfString, sortOrder); 
while (cur.moveToNext()) 
{ 
    id = cur.getString(0); 
    name = cur.getString(1); 
    photoId = cur.getString(2); 
    lookUpKey = cur.getString(3); 

    Contact c = new Contact(id, name, photoId, lookUpKey); 
    contactList.addContact(c); 
} 

另一件事我會檢查,沒有任何排序查詢,但有趣的是看它有多少額外的循環使用排序,也許還有另一種,更高效,方式做它。

雖然這很明顯,我仍然會問Customer類是否輕量級,以及它什麼都不做,只是初始化它的成員。此外,該ContactListaddContact方法只是將其他項目添加到其包裝或擴展List<Customer>

一般說明,圍繞任何與try/catch/finally相關的遊標工作總是一個很好的做法,以確保在完成後關閉遊標。

無論如何,處理問題,如這一個是時,無論是查詢效率不高或解析循環做得不對

+0

我按照您的指示。指的是: '雖然這很明顯,但我仍然會問客戶類是否輕量級,以及它什麼都不做,只是初始化其成員。此外,該ContactList的addContact方法只是將其他項目添加到其包裝或擴展列表。 ' 正如你所說 - 輕量級。 但是,按照您的建議,我需要花費大量時間來創建列表爲46毫秒。我添加traceview分析可能這可能有所幫助。 [traceview](http://s16.postimage.org/6bu3zz9g5/image.jpg)。 –

+0

對不起,但我無法從您的轉儲中獲得任何相關信息,只顯示創建聯繫人列表(根據您的標記)花費的時間以及繪圖過程中花費的時間。你正在畫什麼或在之後? 另一方面,如果您可以避免在每次迭代中創建新對象(不要使用關鍵字「new」),它會爲您節省更多cpu週期 – amirlazarovich

1

我想說equalsIgnoreCase從cur.getColumnIndex調用。如果不是每次在while循環中調用這些函數,而是隻調用一次並存儲它們,那麼可以使它更快。

+0

這是我提出的解決方案(查看最後一段) –