如何根据Spinner选中的国家动态修改OkHttp的API请求URL
具体实现方案
第一步:重构fetchJson方法,移除硬编码国家值
将写死的Argentina抽为方法入参,同时对国家名称做URL编码,避免带空格、特殊字符的国家名导致API请求参数解析失败,修改后的方法结构:
import android.net.Uri // ...其他原有代码 fun fetchJson(targetCountry: String){ val client = OkHttpClient() // 对入参做URL编码后拼接请求地址 val fullUrl = "https://covid-193.p.rapidapi.com/statistics?country=${Uri.encode(targetCountry)}" val request = Request.Builder() .url(fullUrl) .get() .addHeader("x-rapidapi-key", "mykey") .addHeader("x-rapidapi-host", "covid-193.p.rapidapi.com") .build() // 方法内后续原有的OkHttp请求逻辑保持不变即可 }
注意:直接拼接带空格的国家名(比如"South Korea")会导致URL格式非法,触发API返回400参数错误,用
Uri.encode处理参数值是Android下最稳妥的实现方式。
第二步:调整调用逻辑,把Spinner选中值传入方法
移除onCreate方法里原来无参直接调用fetchJson()的代码,在Spinner的选中回调里,拿到用户选中的国家名称后直接传参调用请求:
// 放在onCreate方法内的原有代码 binding.spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{ override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { val country = parent?.getItemAtPosition(position).toString() Toast.makeText(this@MainActivity, "Selected: $country", Toast.LENGTH_SHORT).show() // 选中国家后,直接带参数请求对应国家的疫情统计数据 fetchJson(country) } override fun onNothingSelected(parent: AdapterView<*>?) { // 列表为空时无需处理请求逻辑 } }
额外提醒
- 不需要额外定义全局成员变量存储选中的国家值,回调拿到值直接传参即可,能减少状态不同步、内存泄漏的风险
- 页面第一次加载时,Spinner会自动触发一次
onItemSelected回调(默认选中列表第一项),无需单独写初始加载的请求逻辑,会自动获取默认选中国家的数据 - 注意不要保留方法内原来硬编码的Argentina值,避免被固定参数覆盖
内容的提问来源于stack exchange,提问作者hade34
相关产品推荐
相关产品推荐

