2012-01-27 4 views
0

私は、対応する連絡先名のリストに変換する必要がある電話番号のリストを持っているので、連絡先リストで各番号を順番にチェックして名前を返すメソッドがあります。電話番号に関連付けられた連絡先名を取得するには、より良い方法がありますか?

リストの長さはおよそ20です。これを行うときは少し遅れています.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; 
} 

は、それがすべてで遅延を削減するだろう、単なるものではなくすべての名前を返す方法にしましたか?

+0

もっと早く...? – Lion

答えて

1

あなたの問題には2つの問題があると思います。

i)クエリを行うために最適な方法を使用していない可能性があります。私が自分で行っていないので、私があなたに尋ねることができるのは、この質問を確認することです。 How to read contacts on Android 2.0

ii)それが問題でない場合は、多分このショットを与えることができます。なぜ特定の順序で数字を並べ替えてはいけないのですか?すべての連絡先を取得します。また、同じorder.Nowでorder by句を使用して、電話番号フィールド上でクエリ結果を注文してください。あなたのリストの最初の番号を確認してみてください。クエリ結果のインデックスiに見つかった場合、リストの次の数値はクエリ結果のiより大きいインデックスでのみ検出されます。これまでのi-1クエリの結果を反復処理する必要はありません。順序がn^nからnlognに減少しました。 このようにして、連絡先に対して1つのクエリだけを作成する

P.S.このような小さなデータセットのIMHO私は、パフォーマンスの主な問題は複数のクエリ数であると信じています。

+0

あなたの答えをありがとう。数字は既に昇順でソートされているので、私はそのように実装しようとするので、同時にすべての連絡先を照会します。 –

関連する問題