私は通話履歴アプリを書いています。しかし、非同期でリストビューに画像をロードすると、リストビューのスクロールが遅れて表示されます。私はすべての時間のかかるジョブをワーカー スレッドに配置し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;
}