Заставить библиотеку подкачки сделать запрос API - PullRequest
0 голосов
/ 24 мая 2018

Я успешно реализовал PagedList.BoundaryCallback, который загружает список предстоящих фильмов из базы данных "themoviedb" и сохраняет ответ в базу данных.Но это не работает так, как я хочу.Поскольку запрос возвращает список предстоящих фильмов, ответ часто меняется.Но если у меня уже есть данные в моей базе данных, метод onZeroItemsLoaded () не вызывается.У меня вопрос: как я могу заставить источник данных или этот граничный обратный вызов всегда делать запрос API и обновлять содержимое моей базы данных из сети?

public class UpcomingMoviesBoundaryCallback extends PagedList.BoundaryCallback<MovieListItemEntity> {
public static final String TAG = UpcomingMoviesBoundaryCallback.class.getSimpleName();

private UpcomingMoviesRepository upcomingMoviesRepository;
private int page = 1;

public UpcomingMoviesBoundaryCallback(UpcomingMoviesRepository upcomingMoviesRepository) {
    this.upcomingMoviesRepository = upcomingMoviesRepository;
}

@Override
public void onZeroItemsLoaded() {
    super.onZeroItemsLoaded();
    Log.d(TAG, "onZeroItemsLoaded: ");
    load();
}

@Override
public void onItemAtEndLoaded(@NonNull MovieListItemEntity itemAtEnd) {
    super.onItemAtEndLoaded(itemAtEnd);
    Log.d(TAG, "onItemAtEndLoaded: ");
    load();
}

@SuppressLint("CheckResult")
private void load() {
    upcomingMoviesRepository.getUpcoming(page)
            .doOnSuccess(result -> {
                upcomingMoviesRepository.saveUpcomingMovies(result);
                page = result.getPage() + 1;
            })
            .subscribeOn(Schedulers.io())
            .subscribe(result -> {
                Log.d(TAG, "load: " + result);
            }, error -> {
                Log.d(TAG, "load: error", error);
            });
}

}

public class UpcomingMoviesRepositoryImpl implements UpcomingMoviesRepository {
private static final String TAG = UpcomingMoviesRepository.class.getSimpleName();

private MovieResponseMapper movieResponseMapper = new MovieResponseMapper();
private MovieAppApi mMovieAppApi;
private UpcomingDao mUpcomingDao;

public UpcomingMoviesRepositoryImpl(MovieAppApi mMovieAppApi, UpcomingDao mUpcomingDao) {
    this.mMovieAppApi = mMovieAppApi;
    this.mUpcomingDao = mUpcomingDao;
}

@Override
public Single<MovieListResponse> getUpcoming(int page) {
    return mMovieAppApi.upcoming(page);
}

@Override
public Single<MovieListResponse> getUpcoming() {
    return mMovieAppApi.upcoming();
}

@Override
public void saveUpcomingMovies(MovieListResponse movieListResponse) {
    Executors.newSingleThreadExecutor().execute(() -> {
        long[] inseted = mUpcomingDao.save(movieResponseMapper.map2(movieListResponse.getResults()));
        Log.d(TAG, "saveUpcomingMovies: " + inseted.length);
    });
}

@Override
public LiveData<PagedList<MovieListItemEntity>> getUpcomingLiveData() {
    PagedList.Config config = new PagedList.Config.Builder()
            .setEnablePlaceholders(true)
            .setPageSize(12)
            .build();
    DataSource.Factory<Integer, MovieListItemEntity> dataSource = mUpcomingDao.upcoming();
    LivePagedListBuilder builder =
            new LivePagedListBuilder(dataSource, config)
            .setBoundaryCallback(new UpcomingMoviesBoundaryCallback(this));
    return builder.build();
}

}

1 Ответ

0 голосов
/ 30 июня 2018

Внутри репозитория вы можете запросить базу данных, чтобы проверить, устарели ли данные, тогда вы можете запустить асинхронный сетевой вызов, который запишет результат непосредственно в базу данных.Поскольку база данных соблюдается, пользовательский интерфейс, связанный с LiveData<PagedList>, автоматически обновится, чтобы учесть новый набор данных.

@Override
public LiveData<PagedList<MovieListItemEntity>> getUpcomingLiveData() {
    if(mUpcomingDao.isDatasetValid()) //Check last update time or creation date and invalidate data if needed
        upcomingMoviesRepository.getUpcoming()
            .doOnSuccess(result -> {
                upcomingMoviesRepository.clearUpcomingMovies()
                upcomingMoviesRepository.saveUpcomingMovies(result);
            })
            .subscribeOn(Schedulers.io())
            .subscribe(result -> {
                Log.d(TAG, "load: " + result);
            }, error -> {
                Log.d(TAG, "load: error", error);
            });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...