如何解决android,使用android livedata
问题是,使用LiveData是否会产生一些开销以及多少开销(无法从Doc中找到),还是可以忽略开销?
不要以为这是关于观点的问题,但确实想知道在以下情况下使用LiveData可能带来多大的麻烦(或多少开销),尤其是UI一次获取数据的一种(并且可能有多种此类UI)。
TL; DR 下面是用例,它从远程获取数据并将其发布到liveData。但是之后,这个liveData似乎在内存中什么也没做,听起来像是浪费(如果愿意,则泄漏)。并与使用协程进行比较。
用例是将有多个ui /片段(类似于集合的视图分页器,并且一些单独的片段堆叠在后堆栈中)。 每个片段都通过uuid显示数据(数据是通过一次网络调用获取的。)
一直在使用LiveData传递从存储库中获取的数据。
但是,有人质疑LiveData仅通过网络获取会为“一次”带来一些开销。也就是说,将数据发布到liveData中并由观察者获取后,附加的liveData会浪费掉内存。
问题:使用LiveData会产生多少开销?
并且可以很容易地更改为使用协程,这会比使用LiveData更好吗?
这里有一些简化的代码可以展示这个想法。 每个片段的viewModel(因此片段上有一个liveData):
class MyViewModel() : ViewModel() {
// for liveData approach:
private val liveData = MutableLiveData<Data>()
fun fetchLiveData(uuid: String): LiveData<Data> {
viewModelScope.launch {
val data = repository.getDataByUUID(uuid)
liveData.postValue(data)
}
return liveData
}
// for coroutines approach
private var fetchedData: Data? = null
suspend fun fetchData(uuid: String): Data {
withContext(Dispatchers.IO) {
fetchedData = repository.getDataByUUID(uuid) // note: the repository.getDataByUUID() is a suspend function wraps call from retrofit built with coroutines
}
// will suspend until fetchedData is coming back
return fetchedData!!
}
}
一个人在片段中使用liveData:
@Synchronized
fun observeDataByUUID(uuid: String) {
viewModel?.let {
val liveData = it.fetchLiveData(uuid)
liveData?.observe(viewLifecycleOwner,Observer {
// do ui display with the data
})
}
}
这是使用协程的:
val scope = CoroutineScope(
Job() + Dispatchers.Main
)
@Synchronized
fun fetchDataByUUID(uuid: String) {
viewModel?.let {
scope.launch(Dispatchers.Main) {
val data = it.fetchData(uuid)
data?.let{
// do ui display with the data
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。