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呼び出しは、runQueryが呼び出されるたびに、アクティビティのstartManagingCursorを呼び出します。バックグラウンドスレッドがstartManagingCursorを呼び出しているため、これは理想的ではありません。また、アクティビティが破棄されるまで、多くのカーソルが開いたままになる可能性があります。

アダプター内で使用されるアクティビティーのハンドルを持つアダプターに以下を追加しました

@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 に答える