我有一个应用程序,其中有一个API调用,其中包含一些数据(存储在HashMap<String, Double>中),我希望将这些数据存储在List中,然后将该列表的值推送到数据库.以下是来self 的ViewModel的一些记录的回复:

Success(data={A=1.1, B=2.2 ... })

如您所见,响应包装在泛型类中.我不知道如何从该响应中检索密钥.我觉得我什么都试过了...

Generic class

sealed class RetrofitResult{
 data class Success<out T>(val myData: T) : RetrofitResult()
 data class Error(val myError: Throwable) : RetrofitResult()
}

Repository

    suspend fun getData(): RetrofitResult{
        return try {
            val response = myApi.makeCall()
            RetrofitResult.Success(myData= response.body()?.myHashMap)
        } catch (exception: IOException) {
            RetrofitResult.Error(error = exception.cause!!)
        }
    }

ViewModel

private val _dataStatus = MutableLiveData<RetrofitResult>()
val latestRates: LiveData<RetrofitResult> get() = _dataStatus 


    fun myData() {
        viewModelScope.launch {
            try {
                val apiResponse = myRepository.getData()
                _dataStatus .value = apiResponse 

            } catch (exception: IOException) {
                //TODO
            }
        }
    }

现在,我想从响应中获取密钥,并将其插入到List中,这样我就会得到如下内容:

val dummyList: List<String> = listof("A", "B" ... )

推荐答案

您应该将泛型类型向上推送到密封类超类型,以便泛型类型可以出现在所有参数和返回类型中.

Error类型可以指定它满足Nothing,这在逻辑上被视为所有类型的子类型,因此在使用单独的Error实例时不必指定它.

sealed class RetrofitResult<out T>{
  data class Success<out T>(val myData: T) : RetrofitResult<T>()
  data class Error(val myError: Throwable) : RetrofitResult<Nothing>()
}

然后,在使用密封类类型时指定此类型:

suspend fun getData(): RetrofitResult<HashMap<String, Double>>{
  //...
}

//...

private val _dataStatus = MutableLiveData<RetrofitResult<HashMap<String, Double>>>()

我指定了一个不可为空的数据类型.您需要处理Body为空的可能情况.也许会把这变成一个错误.

我还建议您的数据类型使用Map,而不是HashMap.HashMap不仅是可变的,这在LiveData或流中使用很容易出错,而且它还是MuableMap的一个奇怪的特定子类型,无缘无故.

Android相关问答推荐

致命异常:java.lang. SecureExcellent::用户10021和当前进程都没有android. permissions.Change_WIFI_STATE

Android可绘制边框删除底线

无法加载类';com.android.build.api.extension.AndroidComponentsExtension';

触发PurchasesUpdatedListener回调时,billingClient.launchBillingFlow之前设置的成员变量丢失

如何在使用 PointerInput 修改器时添加点击时的波纹效果

Clean MVVM 架构中的 API 响应处理

appcompat 依赖从何而来?

在 Jetpack Compose 中自动滚动后面的项目

Android Transitions API - 在 24-48 小时后停止接收任何更新

如何在屏幕旋转或系统主题更改后将光标移动到 TextField 的末尾并保持键盘显示?

我的 React Native 在 11 月 4 日之前运行良好,但现在在运行 yarn android 时抛出异常

如何限制键盘输入键不允许在下一行输入(Android Jetpack Compose 中的 TextField)

将应用更改为暗模式后 Android MainActivity 数据泄漏

如何在 Android Studio 中创建新的可组合函数?

Jetpack Compose:mutableStateOf 不随流量更新

协程是否在 if 条件下保持秩序?

如何从 Jetpack Compose 中的 Radio 组中获取价值

Android - 水平(从右到左)圆形背景 colored颜色 过渡

使用 Jetpack Compose 的深层链接导航到可组合项

Android TTS 在屏幕关闭一段时间后停止朗读