有人可以在runQueryOnBackgroundThread上向我解释一下吗?

时间:2012-10-09 05:22:36

标签: android

有人可以向我解释一下运行查询背景线程是什么,因为我已经阅读了一些来源,但仍然不理解它?

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

1 个答案:

答案 0 :(得分:3)

适配器中我的Activity的句柄和过滤器中的runQuery调用在调用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); 
} 

这可确保适配器使用的当前游标也由活动管理。当光标被适配器管理关闭时,活动被删除。适配器保留的最后一个光标将由活动关闭,它仍由活动管理。