Android Studio中Retrofit跨API获取并比对Genre ID方案问询
解决方案
1. 定义匹配API响应的数据模型类
先确保数据模型和API返回结构严格对应,从根源避免类型不匹配问题:
分类数据模型
// 分类接口根响应模型 public class GenresResponse { private List<Genre> genres; public List<Genre> getGenres() { return genres; } public void setGenres(List<Genre> genres) { this.genres = genres; } // 分类子模型 public static class Genre { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }
电影数据模型
// 电影接口根响应模型(按需补充其他字段) public class MovieDataModel { private String release_date; private List<Integer> genre_ids; // 必须用List<Integer>匹配API返回的数字数组 public String getRelease_date() { return release_date; } public void setRelease_date(String release_date) { this.release_date = release_date; } public List<Integer> getGenre_ids() { return genre_ids; } public void setGenre_ids(List<Integer> genre_ids) { this.genre_ids = genre_ids; } }
2. 补充分类接口的Retrofit方法
在你的API接口类中添加获取分类列表的方法:
@GET("3/genre/movie/list") // 对应TMDB分类接口路径,可根据实际API调整 Call<GenresResponse> getGenreList();
3. 获取分类ID并存储为高效集合
不用HashMap存单纯的ID,直接用HashSet<Integer>存储所有分类ID,比对时效率更高:
// 全局存储所有有效分类ID private Set<Integer> validGenreIds = new HashSet<>(); // 先请求分类数据初始化集合 retrofit.create(YourApiInterface.class).getGenreList().enqueue(new Callback<GenresResponse>() { @Override public void onResponse(Call<GenresResponse> call, Response<GenresResponse> response) { if (response.isSuccessful() && response.body() != null) { List<GenresResponse.Genre> genres = response.body().getGenres(); for (GenresResponse.Genre genre : genres) { validGenreIds.add(genre.getId()); } // 分类数据就绪后,请求电影数据进行比对 fetchMoviesAndCheckGenres(); } } @Override public void onFailure(Call<GenresResponse> call, Throwable t) { // 处理请求失败逻辑 } });
4. 获取电影数据并完成ID比对
在分类集合初始化完成后,请求电影数据并逐个比对ID:
private void fetchMoviesAndCheckGenres() { HashMap<String, String> params = new HashMap<>(); // 添加你的请求参数,如api_key、sort_by等 retrofit.create(YourApiInterface.class).MOVIE_DATA_MODEL_CALL(params).enqueue(new Callback<MovieDataModel>() { @Override public void onResponse(Call<MovieDataModel> call, Response<MovieDataModel> response) { if (response.isSuccessful() && response.body() != null) { MovieDataModel movie = response.body(); List<Integer> movieGenreIds = movie.getGenre_ids(); // 遍历电影的genre_ids,检查是否在有效分类集合中 for (Integer id : movieGenreIds) { if (validGenreIds.contains(id)) { Log.d("GenreCheck", "电影包含有效分类ID: " + id); } else { Log.d("GenreCheck", "电影包含未定义的分类ID: " + id); } } } } @Override public void onFailure(Call<MovieDataModel> call, Throwable t) { // 处理请求失败逻辑 } }); }
关键注意事项
- 类型严格匹配:确保
movieGenreIds定义为List<Integer>,和API返回的数字数组完全对应,避免字符串转数字的额外操作和错误。 - 集合选择合理:如果只需要比对ID是否存在,
HashSet的contains()操作效率远高于HashMap;如果需要同时保存ID和分类名称,再使用Map<Integer, String>(key存ID,value存名称)。 - 请求顺序控制:必须先获取分类数据并初始化集合,再请求电影数据,避免集合为空导致比对无意义。
内容的提问来源于stack exchange,提问作者Kailas Mantri
相关产品推荐
相关产品推荐

