【问题标题】:How to use a specific query in Retrofit with Android?如何在 Retrofit with Android 中使用特定查询?
【发布时间】:2018-11-20 09:16:31
【问题描述】:

我有一个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);
}

第一个用于获取正在播放的电影,第二个用于搜索电影。

在我的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);

【问题讨论】:

  • 您能否更具体地了解我的用例?谢谢!
  • 动态使用其中一个是什么意思?比如,有一个方法可以接收@QueryMap,而您只需使用任意数量的查询参数调用它?
  • 你说你想动态地在getMovies()之间切换对吧?有多种方法可以做到这一点,其中一种是使用布尔标志。示例:if (true) { api.getMovies(a,b,c) } else { api.getMovies(a,b) }。与此有关的问题是 if 语句混乱。这可以通过实施策略模式来解决。
  • jetbrains.com/help/idea/… "当您有一个包含大量条件逻辑(即 if 语句)的方法时,您就是在自找麻烦。众所周知,条件逻辑很难管理,并且可能导致您可以在单个方法中创建整个状态机。"

标签: android retrofit retrofit2 android-paging android-paging-library


【解决方案1】:
boolean globalVariableShouldUseGetMoviesCallWithOnlyOneArgument = true

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

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

【讨论】:

  • 感谢您的回答,但我没有用。我需要这个实时。默认情况下,使用这 4 行显示第一个查询的结果。一旦我按下一个按钮,我想显示第二个查询的结果,好吗?你能帮我实现这个目标吗?
  • 我需要 else 部分中 getMovies() 方法的第一个参数是动态的。
  • 你知道什么是 if 语句吗?
  • 不,这不是我想要的。让我再解释一下。我需要实时的数据。例如,现在,在我的MainActivity 中,我使用这 4 行代码在RecyclerView 中显示数据,这很好,因为它使用一个参数调用该方法。现在我想在按钮单击时向api.getMovies("MyStringFromMaiNQActivity", page).enqueue(call); 发送一个字符串,以便使用第二种方法。我现在清楚了吗?
  • 让我们看看我是否理解正确。有时您想用 1 个参数调用 getMovies 并在按钮上单击 2 个参数,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多