Как загрузить несколько страниц с помощью Retrofit и mvvm - PullRequest
0 голосов
/ 09 июля 2020

Я использую в своем приложении Retrofit, Rx Java и шаблон MVVM.

У меня есть API, который получает список фильмов.

В запросе API я должен сказать, какую страницу я хочу загрузить (API возвращает мне 1 страницу (20 элементов) для каждого запроса).

В начале приложения я хочу загрузить 3 страницы.

Как сделать Я делаю это?

То, что у меня сейчас:

Репозиторий:

public MutableLiveData<List<MoviesResult>> getMoviesResultsMutableLiveData(String sort_by, int page, String with_genres, String with_cast) {
        MoviesService moviesService = RetrofitInstance.getMoviesService();
        mDisposable = moviesService.getMovies(
                mApplication.getResources().getString(R.string.api_key),
                sort_by,
                UserSettings.getInstance().includeAdults(),
                true, page, with_genres, with_cast)
                .retryWhen(throwable ->
                        throwable.delay(5, TimeUnit.SECONDS))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<MoviesResponse>() {
                    @Override
                    public void accept(MoviesResponse moviesResponse) throws Throwable {
                        mMoviesResultsMutableLiveData.setValue(moviesResponse.getMoviesResults());
                        mDisposable.dispose();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Throwable {
                        CustomToast customToast = new CustomToast(mApplication.getApplicationContext());
                        customToast.makeCustomText(throwable.getMessage());
                        mDisposable.dispose();
                    }
                });
        return mMoviesResultsMutableLiveData;
    }

ViewModel:

public MutableLiveData<List<MoviesResult>> getMoviesResultMutableLiveData(String sort_by, int page, String with_genres, String with_cast) {
        return mMoviesRepository.getMoviesResultsMutableLiveData(sort_by, page, with_genres, with_cast);
    }

И MainActivity:

mMoviesViewModel.getMoviesResultMutableLiveData(getString(R.string.sort_by_popularity), 1, null, null)
                .observe(this, new Observer<List<MoviesResult>>() {
                    @Override
                    public void onChanged(List<MoviesResult> moviesResults) {
                        Log.d(TAG, "onChanged: "+moviesResults.size());
                    }
                });

Я пытался создать для l oop в основном действии, когда «i» равно страницам, которые я хочу загрузить, а затем установил i для страницы в методе getMovies, но это не сработало для мне.

for (int i = 0; i < 3; i++) {
            mMoviesViewModel.getMoviesResultMutableLiveData(getString(R.string.sort_by_popularity), i, null, null)
                    .observe(this, new Observer<List<MoviesResult>>() {
                        @Override
                        public void onChanged(List<MoviesResult> moviesResults) {
                            Log.d(TAG, "onChanged: "+moviesResults.size());
                        }
                    });
        }

В этом случае я получаю только 1 страницу.

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Не рекомендуется добавлять logi c внутри вашего View (Activity / Fragment), вы используете for l oop inside View, что не идеально. Так что переместите это в вашу ViewModel или UseCase.

Rx Java имеет оператор с именем concatWith , который объединяет несколько наблюдаемых вместе. таким образом, когда ваш Activity / Fragment обедает, вы можете инициировать три вызова API и связываться с ними вместе и возвращать три как единую модель вашему наблюдателю.

Кстати, использование Android Пейджинг из Android Jetpack - лучшее решение для того, чего вы хотите достичь.

0 голосов
/ 09 июля 2020

Ссылка для добавления подкачки без использования библиотеки подкачки Ссылка

...