Loader это абстрактный класс, который выполняет асинхронную загрузку данных. Пока Loader активен, он должен следить за источником своих данных и доставлять новый данные, при их изменении. Как правило любые Loader вызовы должны происходить в главном потоке приложения. Loader подклассы, такие как AsyncTaskLoader, часто выполняют свою работу в отдельном потоке, но доставка результатов загрузки должна быть в главном потоке. Далее в статье будет рассмотрен Loader класс для загрузки Java списков.
Подклассы обычно должны реализовать по крайней мере следующие методы:
Большинство реализаций не должны напрямую наследоваться от Loader класса, но вместо этого, наследоваться от AsyncTaskLoader.
List Loader класс
Ниже приведен класс для загрузки данных, и который возвращает их в виде списка.
public abstract class SimpleListLoader<T> extends AsyncTaskLoader<List<T>> {
private List<T> items;
public SimpleListLoader(Context context) {
super(context);
items = new ArrayList<T>();
}
@Override
public abstract List<T> loadInBackground();
@Override
public void deliverResult(List<T> data) {
if (isReset()) {
if (!items.isEmpty()) {
items.clear();
}
return;
}
if (isStarted()) {
super.deliverResult(data);
}
}
@Override
protected void onStartLoading() {
if (!items.isEmpty()) {
deliverResult(items);
}
if (takeContentChanged() || items.isEmpty()) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
public void onCanceled(List<T> data) {
if (!items.isEmpty()) {
items.clear();
}
}
@Override
protected void onReset() {
super.onReset();
onStopLoading();
if (!items.isEmpty()) {
items.clear();
}
}
}
Использование класса
Использовать такой класс очень легко, достаточно объявить внутренний статический класс, расширяющий SimpleListLoader класс. Далее нужно реализовать метод loadInBackground(), в котором будет происходить асинхронная загрузка данных. После определения внутреннего класса, LoaderManager может его использовать. Ниже приведен пример для загрузки списка типа Item.
public static class EventLoader extends SimpleListLoader<Item> {
public ItemsLoader(Context context) {
super(context);
}
@Override
public List<Item> loadInBackground() {
List<Item> items = new ArrayList<Item>();
// Получение данных из интернет или базы данных ...
return items;
}
}
Класс очень компактный и его удобно использовать, так как вам нужно переопределить всего один метод.
Комментариев нет:
Отправить комментарий