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

Android中使用Glide库加载图片失败问题排查

电影图片加载失败排查(TMDB API + Glide)

我尝试通过TMDB API获取电影列表并加载图片,但不确定是API使用有误还是Glide库的问题,请求帮忙排查图片加载失败的原因。

Glide相关代码

override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
    holder.binding.apply {
        val movie = movies[position]
        val imageBase = "https://image.tmdb.org/t/p/w500/"

        Glide.with(holder.itemView)
            .load(imageBase + moviePoster)
            .error(R.mipmap.tvmovieposter)
            .centerCrop()
            .into(holder.binding.moviePoster)
        movie
        movieTitle.text = movies[position].title
        MovieReleaseDate.text = movies[position].release_date
    }
}

错误信息

/Glide: Load failed for

https://image.tmdb.org/t/p/w500/androidx.appcompat.widget.AppCompatImageView%7B995e7ba
V.ED....I. 0,0- 0,0 #7f080119 app:id/movie_poster} with size
[300x400]

I/Glide: Root cause (1 of 1)
com.bumptech.glide.load.HttpException: Failed to connect or obtain data, status code: -1
at com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:98)

API接口代码

interface MovieApiInterface {
        @GET("/3/movie/popular?api_key=90a54a6b7ac845f17b2b70d45f6c2851")
        fun getMovieList(): Call<MovieResponse>
}

数据类代码

@Parcelize
data class Movie(

    @SerializedName("id")
    val id: String?,

    @SerializedName("title")
    val title: String?,

    @SerializedName("poster_path")
    val poster_path: String?,

    @SerializedName("release_date")
    val release_date: String,
) : Parcelable {
    constructor() : this("", "", "", "")
}

问题排查与修复方案

  1. 核心错误:URL拼接逻辑错误
    从错误信息里的无效URL可以看出,你把布局中的moviePoster(AppCompatImageView实例)直接拼接到了图片基础URL后,导致生成的地址包含View对象的toString内容,完全不是TMDB的合法图片路径,这是加载失败的直接原因。

  2. 代码修复
    将Glide加载的路径改为电影数据中的poster_path字段,同时处理字段为空的情况:

    Glide.with(holder.itemView)
        .load(if (!movie.poster_path.isNullOrEmpty()) imageBase + movie.poster_path else null)
        .error(R.mipmap.tvmovieposter)
        .centerCrop()
        .into(moviePoster)
    
  3. 额外优化建议

    • 不要在API接口中硬编码api_key,建议将密钥放在build.gradle配置或本地安全文件中,避免泄露。
    • TMDB返回的id是整数类型,建议将数据类中的id字段改为val id: Int?,避免类型不匹配问题。
    • 可以给Glide添加占位符:.placeholder(R.mipmap.placeholder),提升用户等待时的体验。

内容的提问来源于stack exchange,提问作者kamyab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:33:21