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
相关产品推荐
相关产品推荐

