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

Kotlin Compose调用网页API拉取JSON数据时程序崩溃求助

解决Android中调用境外API崩溃的问题

核心崩溃原因

直接在主线程执行网络请求会触发NetworkOnMainThreadException——Android从3.0版本开始严格禁止主线程处理耗时网络操作,你的代码直接调用imagesURL.readText()就是在主线程执行,必然导致崩溃。

修复步骤

1. 确认网络权限配置

在AndroidManifest.xml中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

如果应用目标SDK为Android 9(API 28)及以上,且API使用HTTP协议,需在application标签内额外添加:

android:usesCleartextTraffic="true"

你的目标API是HTTPS协议,这一步可跳过,若后续遇到明文流量限制再补充配置。

2. 切换到后台线程执行网络请求

推荐使用Kotlin协程实现,这是Android Kotlin项目的标准异步方案:

// 在Activity/Fragment中调用
lifecycleScope.launch(Dispatchers.IO) {
    try {
        val imagesURL = URL("https://archives.bulbagarden.net/w/api.php?action=query&prop=imageinfo&format=json&iiprop=url&titles=File:HOME655.png|File:HOME654.png")
        val responseText = imagesURL.readText()
        // 切换回主线程处理结果(如更新UI、解析数据)
        withContext(Dispatchers.Main) {
            Log.d("PokemonAPI", responseText)
            // 后续可解析JSON获取图片URL
        }
    } catch (e: Exception) {
        e.printStackTrace()
        // 处理异常(如网络连接失败、API访问超时)
        withContext(Dispatchers.Main) {
            // 给用户展示错误提示
        }
    }
}

3. 用Retrofit优化API调用(可选)

若你尝试过Retrofit但未成功,可参考以下配置:
首先在build.gradle(Module)中添加依赖:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

定义API接口:

interface BulbagardenApi {
    @GET("w/api.php")
    suspend fun getImageUrls(
        @Query("action") action: String = "query",
        @Query("prop") prop: String = "imageinfo",
        @Query("format") format: String = "json",
        @Query("iiprop") iiprop: String = "url",
        @Query("titles") titles: String
    ): Response<JsonObject>
}

初始化Retrofit并发起请求:

val retrofit = Retrofit.Builder()
    .baseUrl("https://archives.bulbagarden.net/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

val api = retrofit.create(BulbagardenApi::class.java)

// 在协程中调用接口
lifecycleScope.launch(Dispatchers.IO) {
    try {
        val response = api.getImageUrls("File:HOME655.png|File:HOME654.png")
        if (response.isSuccessful) {
            val jsonData = response.body()
            withContext(Dispatchers.Main) {
                // 解析JSON数据获取图片URL
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

额外注意事项

  • 境外API可能存在访问延迟或地域限制,建议添加超时处理(可通过OkHttpClient为Retrofit配置超时时间)。
  • 解析Bulbagarden的API返回时,需注意JSON结构:图片URL嵌套在query -> pages字段下的imageinfo数组中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:10:42