Как использовать поток в курсоре?

#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;
    }
}
  

CursorAdapter

Когда все будет готово, onLoadFinished будет вызван ваш курсор, и вот вы здесь. Используйте его и остановитесь.