2012-01-27 67 views
0

我有我需要轉換成相應的聯繫人名稱的列表,電話號碼列表,所以我有檢查又與聯繫人列表中的每個數字,返回名稱的方法。有沒有更好的方式檢索與電話號碼關聯的聯繫人姓名?

由於名單大致是20號長,這樣當有輕微的延遲,也許1 1/2秒,在理想情況下,我想切出。我想知道是否有任何事情可以優化我的代碼?

我調用該方法getContactDisplayNameByNumber()這樣的:

ArrayList<String> tableCol1 = new ArrayList<String>(); 

for (int j = 0; j < tableCol1.size(); j++) { 
     String name = getContactDisplayNameByNumber(tableCol1.get(j)); 
     tableCol1.set(j, name); 
     } 

這裏是方法:

public String getContactDisplayNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, new String[] { 
      BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME }, 
      null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup 
        .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 

難道砍下延遲在所有如果我把for循環的方法中,並使它成爲一種返回所有名字而不僅僅是一種方法的方法?

+0

更快的方法...? – Lion 2012-01-27 19:06:27

回答

1

我相信可以爲您的問題的兩個問題。

我)也許你不使用的最佳方法,使查詢。由於我自己沒有這樣做,我只能問你是否可以看看這個問題來確認。 How to read contacts on Android 2.0

二)如果這不是問題,那麼也許你可以給這個一杆。爲什麼不按特定順序對數字進行排序(比如增加)。獲取所有聯繫人。也可以使用order by子句以相同順序在電話號碼字段中查詢結果。現在嘗試檢查列表中的第一個號碼。如果它在查詢結果中的索引i處找到,那麼您可以確保列表中的下一個數字只能在查詢結果中的大於i的索引處找到。您不必遍歷以前的i-1查詢結果。訂單從n^n減少到nlogn。 也這樣做,你只有一個查詢上的聯繫人

附:恕我直言,在這樣一個小的數據集我相信性能的主要問題是多個查詢。

+0

感謝您的回答。這些數字已經按升序排列,所以我會試着按照這種方式實現它,以便同時查詢所有聯繫人。 – 2012-01-28 00:32:03

相關問題