При работе с базой данных, которая возвращает данные типа Cursor
, вам может понадобиться Loader. Такая необходимость возникает когда загрузка данных из базы может занимать много времени и это отражается на поведении пользовательского интерфейса. Использование Loader
класса делает эту загрузку асинхронной. Ниже будет рассмотрен класс асинхронной загрузки данных типа Cursor
.
public abstract class SimpleCursorLoader extends AsyncTaskLoader<Cursor> { private Cursor mCursor; public SimpleCursorLoader(Context context) { super(context); } @Override public abstract Cursor loadInBackground(); @Override public void deliverResult(Cursor cursor) { if (isReset()) { if (cursor != null) { cursor.close(); } return; } Cursor oldCursor = mCursor; mCursor = cursor; if (isStarted()) { super.deliverResult(cursor); } if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { oldCursor.close(); } } @Override protected void onStartLoading() { if (mCursor != null) { deliverResult(mCursor); } if (takeContentChanged() || mCursor == null) { forceLoad(); } } @Override protected void onStopLoading() { cancelLoad(); } @Override public void onCanceled(Cursor cursor) { if (cursor != null && !cursor.isClosed()) { cursor.close(); } } @Override protected void onReset() { super.onReset(); onStopLoading(); if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } } }
Данный класс представляет собой обычный Loader, со стандартными обратными вызовами, только для Cursor
типа. Класс сам заботиться о закрытии Cursor
объекта.
Использование класса
Использовать такой класс очень легко. Самый простой способ, использовать внутренний статический класс, расширяющий наш SimpleCursorLoader
. Пример такого использования приведен ниже:
public class PhotoCursorLoader extends SimpleCursorLoader { private SqlDatabase sqlDb; public PhotoCursorLoader(Context context) { super(context); sqlDb = new SqlDatabase(context); } @Override public Cursor loadInBackground() { // Возвращаем Cursor с информацией о фотографиях return sqlDb.photoTable.findAll(); } }
Переопределяя метод loadInBackground()
, мы в нем асинхронно получаем нужные записи из базы данных. Использование внутреннего статического класса избавляет от создания новых файлов, а переопределение всего одного метода loadInBackground()
, делает его очень компактным.
Комментариев нет:
Отправить комментарий