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("", "", "", "") }
问题排查与修复方案
核心错误:URL拼接逻辑错误
从错误信息里的无效URL可以看出,你把布局中的moviePoster(AppCompatImageView实例)直接拼接到了图片基础URL后,导致生成的地址包含View对象的toString内容,完全不是TMDB的合法图片路径,这是加载失败的直接原因。代码修复
将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)额外优化建议
- 不要在API接口中硬编码
api_key,建议将密钥放在build.gradle配置或本地安全文件中,避免泄露。 - TMDB返回的
id是整数类型,建议将数据类中的id字段改为val id: Int?,避免类型不匹配问题。 - 可以给Glide添加占位符:
.placeholder(R.mipmap.placeholder),提升用户等待时的体验。
- 不要在API接口中硬编码
内容的提问来源于stack exchange,提问作者kamyab
相关产品推荐
相关产品推荐

