You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:37