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; } }
Класс очень компактный и его удобно использовать, так как вам нужно переопределить всего один метод.
Комментариев нет:
Отправить комментарий