我是MVVM的新手,因此我需要一些帮助来在ViewModel类中实现这个方法。
下面是用不同的值(流行电影,顶级电影等)调用api的逻辑(for loop)。
如您所见,我有一个带有sort_by值数组列表(查询api中所需的列表以获得排序列表)。 但正如我们所知,在activity中进行登录并将其碎片化是一种糟糕的做法。
这里是主要的activity方法。
private void getMoviesList() {
ArrayList<Integer> sortBy = new ArrayList<>();
sortBy.add(R.string.sort_by_popularity);
sortBy.add(R.string.sort_by_top_rated);
for (int i = 0; i < sortBy.size(); i++) {
mMoviesViewModel = new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication()).create(MoviesViewModel.class);
int finalI = i;
mMoviesViewModel.getMoviesResultMutableLiveData(sortBy.get(i).toString(), 1, null, null)
.observe(this, new Observer<List<MoviesResult>>() {
@Override
public void onChanged(List<MoviesResult> moviesResults) {
if (moviesResults != null) {
addRecyclerView((ArrayList<MoviesResult>) moviesResults, sortBy.get(finalI));
}
}
});
}
}
和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);
}
Andrepository:
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;
}
还不清楚你到底想要达到什么目的。