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