#android #multithreading #sqlite #android-cursoradapter
#Android #многопоточность #базы данных SQLite #android-cursoradapter
Вопрос:
Как использовать Thread
в Cursor
. Например, у нас есть этот код :
cursor = sql.rawQuery(OUR QUERY..., null);
if (cursor.moveToFirst()) {
do {
SOME CODE....
} while (cursor.moveToNext());
}
Можем ли мы использовать?
if (cursor.moveToFirst()) {
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
do {
SOME CODE....
} while (cursor.moveToNext());
}
});
thread.start();
}
Комментарии:
1. Курсор не потокобезопасен
2. Может помочь дополнительный контекст. Что вы хотите сделать?
3. Я ищу в огромных данных. При нажатии на ввод программной клавиатуры для поиска мне нужно отпустить кнопку и окно поиска.
Ответ №1:
Вы могли бы использовать CursorLoader
вместо класса use Thread (избегайте этого, когда можете.)
Ваша Activity будет реализована LoaderManager.LoaderCallbacks<Cursor>
, которая содержит все необходимые вам обратные вызовы.
Затем вам нужно инициализировать CursorLoader, используя его initLoader
метод.
private static final int LOADER_ID = 1;
getLoaderManager().initLoader(LOADER_ID, null, this);
где его аргументы:
int id, Bundle args, LoaderCallbacks<D> callback
ID :
Уникальный идентификатор для этого загрузчика. Может быть любым, что вы хотите. Идентификаторы привязаны к определенному экземпляру LoaderManager.
Это число, которое вы используете, я использовал 1.
Пакет
Необязательные аргументы для предоставления загрузчику при построении. Если загрузчик уже существует (новый создавать не нужно), этот параметр будет проигнорирован, и будут по-прежнему использоваться последние аргументы.
Если вам нужно предоставить аргументы, это правильный аргумент.
Обратный вызов
Интерфейс LoaderManager будет вызываться, чтобы сообщить об изменениях в состоянии загрузчика. Требуется
Это наш класс Activity, поскольку он выполняет функцию обратного вызова.
После этой строки вызывается onCreateLoader
, и она будет содержать два аргумента: loaderID, bundle
Я думаю, вы можете понять, что это такое.
Тогда это то, как вы могли бы реализовать onCreateLoader
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle)
{
/*
* Takes action based on the ID of the Loader that's being created
*/
switch (loaderID) {
case LOADER_ID: // our ID!
// Returns a new CursorLoader
return new CursorLoader(
getActivity(), // Parent activity context
mDataUrl, // Table to query
mProjection, // Projection to return
null, // No selection clause
null, // No selection arguments
null // Default sort order
);
default:
// An invalid id was passed in
return null;
}
}
Когда все будет готово, onLoadFinished
будет вызван ваш курсор, и вот вы здесь. Используйте его и остановитесь.