Пейджинговая библиотека - обратный вызов границы для сети + дБ с API, принимающими страницу и размер - PullRequest
0 голосов
/ 22 мая 2018

Короткий вопрос :

Как правильно обрабатывать базу данных + сеть в библиотеке подкачки из компонентов архитектуры, используя API, который использует страницу + размер для загрузки новой страницы иBoundaryCallback класс?

Исследование и объяснение

В настоящее время класс BoundaryCallback, используемый в библиотеке подкачки для компонентов архитектуры, получает какПараметр экземпляр элемента в списке без фактического контекста, где этот элемент находится.Это происходит в onItemAtFrontLoaded и onItemAtEndLoaded.

Мой Api должен получить страницу и размер страницы для загрузки следующего фрагмента данных.Предполагается, что обратный вызов границы, добавляемый как часть построителя выгружаемого списка, должен сообщать вам, когда следует загружать следующую страницу данных на основе расстояния предварительной выборки и размера страницы.

Поскольку для API требуется номер страницы и размерНа странице для предоставления я не вижу способа отправить это на Api, просто получив один из элементов из списка, как предлагается в onItemAtFrontLoaded и onItemAtEndLoaded.Проверяя примеры Google в этой ссылке , они используют имя последнего элемента, чтобы получить следующий, но это не соответствует API с размером страницы +.

У них также естьдругой пример, в котором используется только сеть, использующая PagedKeyedDatasource, но нет примера или подсказки, как смешать это с базой данных и BoundaryCallback.

Edit :Единственное решение, которое я нашел до сих пор, - это сохранение последней загруженной страницы в общих настройках, но это звучит как подвох.

Официальный ввод в нее https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468.

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Допустим, вы всегда получаете N=10 элементов на страницу с сервера, а затем сохраняете их в дБ.Вы можете получить количество элементов в дБ с помощью SQL-запроса SELECT COUNT(*) FROM tbl и сохранить его в переменной count.Теперь, чтобы получить номер страницы, который должен быть запрошен следующим, используйте:

val nextPage: Int = (count / N) + 1
0 голосов
/ 03 июля 2019

Документация содержит следующее:

Если вы не используете сетевой API с ключом элемента, возможно, вы используете ключ с ключом страницы илистраниц индексируются.В этом случае библиотека подкачки не знает о ключе страницы или индексе, используемом в BoundaryCallback, поэтому вам нужно отследить его самостоятельно.Это можно сделать одним из двух способов:

Ключ страницы локального хранилища

Если вы хотите полностью возобновить запрос, даже если приложение будет убито и возобновлено,Вы можете хранить ключ на диске.Обратите внимание, что с помощью сетевого API позиционного индекса / индекса страницы есть простой способ сделать это, используя listSize в качестве входных данных для следующей загрузки (или listSize / NETWORK_PAGE_SIZE для индексации страницы).Текущий размер списка не передается в BoundaryCallback.Это связано с тем, что PagedList не обязательно знает количество элементов в локальном хранилище.Заполнители могут быть отключены или DataSource может не подсчитывать общее количество элементов.

Вместо этого для этих позиционных случаев вы можете запросить в базе данных количество элементов и передать их в сеть.

Ключ страницы в памяти

Часто нет смысла запрашивать следующую страницу из сети, если последняя загруженная страница была загружена много часов или дней назад.Если вы храните ключ в памяти, вы можете обновлять его каждый раз, когда начинаете пейджинг из сетевого источника.Сохраните следующий ключ в памяти, внутри вашего BoundaryCallback.При создании нового BoundaryCallback при создании нового LiveData / Observable из PagedList обновите данные.Например, в Paging Codelab индекс сетевой страницы GitHub хранится в памяти.

И ссылки на пример Codelab: https://codelabs.developers.google.com/codelabs/android-paging/index.html#8

0 голосов
/ 28 декабря 2018

Я реализую это:

PagedList.BoundaryCallback<Produto> boundaryCallbackNovidades = new PagedList.BoundaryCallback<Produto>(){
    int proxPagina;
    boolean jaAtualizouInicio=false;

    public void onZeroItemsLoaded() {
        requestProdutos(
            webService.pesquisarNovidadesDepoisDe(LocalDateTime.now().format(Util.formatterDataTime), 0, 20));
    }

    public void onItemAtFrontLoaded(@NonNull Produto itemAtFront) {
        if(!jaAtualizouInicio)
            requestProdutos(
                webService.pesquisarNovidadesMaisRecentesQue(itemAtFront.data.format(Util.formatterDataTime)));
        jaAtualizouInicio=true;
    }

    public void onItemAtEndLoaded(@NonNull Produto itemAtEnd) {
        requestProdutos(
            webService.pesquisarNovidadesDepoisDe(LocalDateTime.now().format(Util.formatterDataTime), proxPagina++, 20));
    }
};


public LiveData<PagedList<Produto>> getNovidades(){
    if(novidades==null){
        novidades = new LivePagedListBuilder<>(produtoDao.produtosNovidades(),
                10)
                .setBoundaryCallback(boundaryCallbackNovidades)
                .build();
    }
    return novidades;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...