0

連絡先のリストを読み込もうとすると、パフォーマンスの問題が発生します。これはコードです:

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( "Some column name"));がわかります。読み込み時間に負担がかかります

traceviewを使用しているときに私が見ることができるもう一つのことは、メソッドへの呼び出しがたくさんあるということです

String.equalsIgnoreCase()

私の推測では、cur.getStringがそれを呼び出しています。

onCreate()で開始されたすべての値をHT(ContactID、Contact)に入れ、抽出されたユーザーIDを使用してcontactsdbから選択するたびにそれらを呼び出すことを考えています。使用量を3回削減します。これは非常に良いことですが、より良い解決策はありますか?

ありがとう

4

2 に答える 2

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);
}

私がチェックするもう1つのことは、並べ替えなしでクエリを実行することです。並べ替えにどれだけの余分なサイクルが使用されるかを確認するのは興味深いことです。おそらく、別のより効率的な方法があります。

これは非常に明白ですが、Customerクラスが軽量であるかどうか、そしてそれがそのメンバーを初期化する以外に何もしないかどうかを尋ねます。また、そのメソッドは、ラップまたは拡張されたに別ContactListaddContactアイテムを追加するだけList<Customer>です。

一般的な注意点として、カーソル関連の作業をtry / catch / finalで囲んで、完了時にカーソルを確実に閉じることをお勧めします。

とにかく、このような問題を処理するときは、クエリが効率的でないか、解析ループが何か間違ったことをしている可能性があります

于 2012-06-23T18:06:02.317 に答える
1

equalsIgnoreCaseはcur.getColumnIndexから呼び出されます。whileサイクルで毎回呼び出すのではなく、一度だけ呼び出して保存すると、高速化できます。

于 2012-06-23T16:04:33.077 に答える