При работе с базой данных, которая возвращает данные типа 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(), делает его очень компактным.
Комментариев нет:
Отправить комментарий