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

Jetpack Compose中Retrofit多GET请求与Coil图片加载问题

Bookshelf项目问题解决方案

一、Repository类型不匹配错误修复

通常是API返回对象与本地BookshelfVolume实体类转换逻辑出错,按以下步骤排查:

  • 核对BookshelfVolume字段与Google Books API返回的Volume结构,确保id、title等核心字段一一对应,比如API返回的书籍ID直接在id字段,实体类需同步定义。
  • 编写类型转换扩展函数,确保输入输出类型正确:
fun Volume.toBookshelfVolume(): BookshelfVolume {
    return BookshelfVolume(
        id = this.id,
        title = this.volumeInfo.title ?: "",
        author = this.volumeInfo.authors?.firstOrNull() ?: "Unknown"
        // 按需添加其他字段转换
    )
}
  • 批量转换API返回列表时,使用map函数处理:
val apiResponse = bookshelfApiService.fetchBooks(query = "android", apiKey = YOUR_API_KEY)
val bookshelfVolumes = apiResponse.items?.map { it.toBookshelfVolume() } ?: emptyList()

二、正确调用单书籍详情接口

在Retrofit接口中通过@Path注解传入书籍ID,定义如下:

interface BookshelfApiService {
    // 书籍列表接口(示例)
    @GET("volumes")
    suspend fun fetchBooks(
        @Query("q") query: String,
        @Query("key") apiKey: String
    ): BooksResponse

    // 单书籍详情接口
    @GET("volumes/{volume_id}")
    suspend fun fetchBookDetails(
        @Path("volume_id") volumeId: String,
        @Query("key") apiKey: String
    ): Volume
}

调用时直接传入目标书籍ID即可:

val targetBookId = "some_book_id"
val bookDetails = bookshelfApiService.fetchBookDetails(targetBookId, YOUR_API_KEY)

三、解析imageLinks构建缩略图链接列表

首先在数据类中正确映射imageLinks结构:

data class Volume(
    val id: String,
    val volumeInfo: VolumeInfo
)

data class VolumeInfo(
    val title: String,
    val imageLinks: ImageLinks? = null
)

data class ImageLinks(
    val smallThumbnail: String?,
    val thumbnail: String?
)

然后提取非空的缩略图链接,可统一处理HTTP链接为HTTPS避免混合内容问题:

fun getValidThumbnails(volume: Volume): List<String> {
    val thumbnails = mutableListOf<String>()
    volume.volumeInfo.imageLinks?.run {
        smallThumbnail?.let { thumbnails.add(it.replace("http://", "https://")) }
        thumbnail?.let { thumbnails.add(it.replace("http://", "https://")) }
    }
    return thumbnails
}

拿到链接后,直接用Coil加载:

val thumbnailUrl = getValidThumbnails(book).firstOrNull()
thumbnailUrl?.let {
    imageView.load(it) {
        placeholder(R.drawable.placeholder)
        error(R.drawable.error)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:59:51