【发布时间】:2021-05-04 15:50:46
【问题描述】:
我从一位前开发人员那里继承了一个 Kotlin Android 项目。例如,他使用挂起函数来处理网络请求。这种函数的一个例子可能是这样的:
suspend fun performNetworkCall(param1: Long, param2: String): ResultOfCall
{
Do()
The()
Stuff()
return theResult
}
到目前为止,一切都很好。现在他的片段有ViewModels,并且他在这些模型中也有方法应该异步调用上述挂起函数并返回一些结果。他是这样做的:
sealed class LiveDataResult<out R>
{
data class Success<T>(val result: T) : LiveDataResult<T>()
data class Failure(val errorMessage: String) : LiveDataResult<Nothing>()
}
fun fetchSomeData(param1: Long, param2: String): LiveData<LiveDataResult<String>> = liveData {
val resultOfCall = performNetworkCall(param1, param2)
if (resultOfCall indicates success)
emit(LiveDataResult.Success("Yay!")
else
emit(LiveDataResult.Failure("Oh No!")
}
在他的片段中,他将这样的方法称为
viewModel.fetchSomeData(0, "Call Me").observe(viewLifecycleOwner) {
when (it)
{
is LiveDataResult.Success -> DoSomethingWith(it.result)
is LiveDataResult.Failure -> HandleThe(it.errorMessage)
}
}
我对整个可观察/协程问题还不是很有经验,所以我对这种方法的问题是:
- 这会不会堆积一大堆
LiveData对象,由于观察者仍处于附加状态而无法释放? - 这是一种不好的方法吗?糟糕到需要重构?如果需要重构,应该如何重构?
【问题讨论】:
标签: kotlin android-livedata kotlin-coroutines suspend