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

如何从封装在泛型中的Retrofit调用结果提取键?

解决方案

步骤1:优化泛型类型(推荐,避免不安全类型转换)

先修改Repository的返回类型,明确指定泛型为HashMap<String, Double>,同时ViewModel的LiveData也同步指定泛型,从根源避免后续类型转换风险:

修改后的Repository代码

suspend fun getData(): RetrofitResult<HashMap<String, Double>>{
    return try {
        val response = myApi.makeCall()
        // 为空时返回空HashMap,避免后续空指针异常
        RetrofitResult.Success(myData= response.body()?.myHashMap ?: hashMapOf())
    } catch (exception: IOException) {
        // 异常处理优先用exception本身,防止cause为空
        RetrofitResult.Error(error = exception.cause ?: exception)
    }
}

修改后的ViewModel代码

private val _dataStatus = MutableLiveData<RetrofitResult<HashMap<String, Double>>>()
val latestRates: LiveData<RetrofitResult<HashMap<String, Double>>> get() = _dataStatus 

fun myData() {
    viewModelScope.launch {
        try {
            val apiResponse = myRepository.getData()
            _dataStatus.value = apiResponse 
        } catch (exception: IOException) {
            // 此处可添加错误处理逻辑,比如记录日志
        }
    }
}

步骤2:提取HashMap的键到List

在观察latestRates的页面(如Activity或Fragment)中,通过when分支判断结果类型,当为Success时直接提取键列表:

viewModel.latestRates.observe(this) { result ->
    when(result) {
        is RetrofitResult.Success -> {
            // 将HashMap的键转换为目标List<String>
            val keyList: List<String> = result.myData.keys.toList()
            // 此时keyList就是你需要的格式,可直接执行数据库存储逻辑
        }
        is RetrofitResult.Error -> {
            // 处理错误场景,比如给用户提示网络异常
        }
    }
}

兼容方案(不推荐,仅用于无法修改泛型的场景)

如果不能调整原有泛型定义,可通过安全类型转换处理,但存在转换失败风险:

viewModel.latestRates.observe(this) { result ->
    when(result) {
        is RetrofitResult.Success -> {
            val hashMap = result.myData as? HashMap<String, Double>
            hashMap?.let {
                val keyList: List<String> = it.keys.toList()
                // 执行数据库存储逻辑
            }
        }
        is RetrofitResult.Error -> {
            // 错误处理
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:07:33