2

私は通話履歴アプリを書いています。しかし、非同期でリストビューに画像をロードすると、リストビューのスクロールが遅れて表示されます。私はすべての時間のかかるジョブをワーカー スレッドに配置しConcurrentHashMap、ワーカー スレッドが ui スレッドをブロックしないようにするために使用しました。
しかし、データベースから画像をロードすると、UI スレッドが少し遅れて表示されます。画像を取得するには、データベースに数回クエリを実行し、ほぼ 1 秒かかります。しかし、それはワーカースレッドで行われるため、ラグは発生しないと思います。

しかし、クエリステートメントを使用してデバッグしddms、改善した後、ラグは消えます。しかし、私はまだ理由を理解できません。contentprovider からのクエリはメイン スレッドをブロックしますか?

ここで編集 すると、スクロールが遅れるクエリコードになります。また、データベースには 70000 件の連絡先が保存されるため、クエリの実行に時間がかかります。

public static long loadRawContactId(Context context, long callId) {
    ContentResolver cr = context.getContentResolver(); 
    Cursor cursor = cr.query(Calls.CONTENT_URI, 
            new String[] {Calls.NUMBER, Calls.GS_ACCOUNT},
            Calls._ID + " = ?",
            new String[] {String.valueOf(callId)},
            null);
    String number = "";
    int account = 0;
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            number = cursor.getString(cursor.getColumnIndex(Calls.NUMBER));
            account = cursor.getInt(cursor.getColumnIndex(Calls.GS_ACCOUNT));
        }
        cursor.close();
    }

    Cursor c = cr.query(Phone.CONTENT_URI, 
            new String[]{Data.RAW_CONTACT_ID},
            Phone.NUMBER + " = ? AND " + Phone.GS_ACCOUNT + " = ?",
            new String[] {number, String.valueOf(account)},
            null);

    long contactId = 0;
    if (c != null) {
        if (c.moveToFirst()) {
            contactId = c.getLong(0);
        }
        c.close();
    }
    return contactId;
}
4

0 に答える 0