【发布时间】: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