4

有人可以向我解释什么是 runQueryOnBackgroundThread,因为我已经阅读了一些资料但仍然不明白吗?

@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint){
    FilterQueryProvider filter = getFilterQueryProvider();
    if (filter != null){
        return filter.runQuery(constraint);
    }

    Uri uri = Uri.withAppendedPath(
                ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(constraint.toString()));

    return content.query(uri, CONTACT_PROJECTION, null, null, null);
}
4

1 回答 1

3

每当调用 runQuery 时,适配器中我的 Activity 的句柄和过滤器中的 runQuery 调用都会调用 Activity 上的 startManagingCursor。这并不理想,因为后台线程正在调用 startManagingCursor 并且在 Activity 被销毁之前可能还有很多游标保持打开状态。

我将以下内容添加到我的适配器中,该适配器具有它在其中使用的 Activity 的句柄

@Override 
public void changeCursor(Cursor newCursor) { 
Cursor oldCursor = getCursor(); 
super.changeCursor(newCursor); 
if(oldCursor != null && oldCursor != newCursor) { 
    // adapter has already dealt with closing the cursor 
    activity.stopManagingCursor(oldCursor); 
} 
activity.startManagingCursor(newCursor); 
} 

这确保适配器使用的当前光标也由活动管理。当游标被适配器关闭时,由活动管理被移除。适配器持有的最后一个游标将被活动关闭,因为它仍然由活动管理。

于 2012-10-09T05:45:17.370 回答