Простой List Loader


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

Класс очень компактный и его удобно использовать, так как вам нужно переопределить всего один метод.

Комментариев нет:

Отправить комментарий