Как использовать определенный запрос в Retrofit с Android? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть интерфейс API, который имеет два перегруженных метода:

public interface Api {
    @GET("movie/now_playing")
    Call<ApiResponse> getMovies(@Query("page") int page);

    @GET("search/movie")
    Call<ApiResponse> getMovies(@Query("query") String query,  @Query("page") int page);
}

Первый используется для воспроизведения фильмов, а второй - для поиска фильмов.

Inмой MainActivity Я использую этот код для отображения данных в RecyclerView:

MovieViewModel movieViewModel = ViewModelProviders.of(this).get(MovieViewModel.class);
MovieAdapter adapter = new MovieAdapter(this);
movieViewModel.moviePagedList.observe(this, adapter::submitList);
recyclerView.setAdapter(adapter);

Это мой MovieViewModel класс:

public class MovieViewModel extends ViewModel {
    LiveData<PagedList<ApiResponse.Movie>> moviePagedList;

    public MovieViewModel() {
        MovieDataSourceFactory movieDataSourceFactory = new MovieDataSourceFactory();
        PagedList.Config config = new PagedList.Config.Builder().setEnablePlaceholders(false).setPageSize(20).build();
        moviePagedList = new LivePagedListBuilder<>(movieDataSourceFactory, config).build();
    }
}

А это мой MovieDataSourceFactory класс:

public class MovieDataSourceFactory extends DataSource.Factory<Integer, ApiResponse.Movie> {
    private MutableLiveData<PageKeyedDataSource<Integer, ApiResponse.Movie>> movieLiveDataSource = new MutableLiveData<>();

    @Override
    public DataSource<Integer, ApiResponse.Movie> create() {
        MovieDataSource movieDataSource = new MovieDataSource();
        movieLiveDataSource.postValue(movieDataSource);
        return movieDataSource;
    }
}

И это мой MovieDataSource класс:

public class MovieDataSource extends PageKeyedDataSource<Integer, ApiResponse.Movie> {
    @Override
    public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, ApiResponse.Movie> callback) {
        Api api = RetrofitClient.getInstance().getApi();
        Callback<ApiResponse> call = new Callback<ApiResponse>() {
            @Override
            public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
                if(response.body() != null){
                    callback.onResult(response.body().movieList, null, page + 1);
                }
            }

            @Override
            public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {}
        };
        api.getMovies(page).enqueue(call);
    }

    //loadBefore and loadAfter methods
}

Если я запускаю этот код, все работает нормально, первый запрос вызывается, и я получаю результат правильно.Вопрос в том, как я могу динамически использовать один или другой?

api.getMovies(query, page).enqueue(call);

1 Ответ

0 голосов
/ 20 ноября 2018
boolean globalVariableShouldUseGetMoviesCallWithOnlyOneArgument = true

private void doNetworkCallAndCheckBooleanStatus(){ 
    if (globalVariableShouldUseGetMoviesCallWithOnlyOneArgument) {
        getMovies(thisIsOneArgumentAsYouCanSee);
    } else {
        getMovies(thisIsUsingTwoArguments, asYouCanSee);
    }
}

private void someOtherMethodInTheApp() {
    globalVariableShouldUseGetMoviesCallWithOnlyOneArgument = false
    doNetworkCallAndCheckBooleanStatus()
}
...