有很多关于架构组件、kotlin和coroutines的信息,但我在任何地方都找不到将这些东西结合起来使用的例子。此处 和 coroutines 一起使用。我有一个想法,但感觉不确定是否是实现这种架构风格的正确方式,我试图使用视图模型+仓库模式,再加上retro fit和coroutines。
我有以下的仓库。
class FooRepostiroy(private val fooHttpService: FooHttpService) {
suspend fun someMethod() : SomeResult {
val response = fooHttpService.someRemotCall() // which is also a suspending method using retrofit-2
// process response, store it using room and return SomeResult data object
然后我使用ViewModel中的FooRepository 但是因为someMethod是一个悬空的方法,我需要把它包裹在一个coroutine的范围内。
class FooViewModel(private val fooRepositoru : FooRepository) : ViewModel() {
private var someMethodJob : Job? = null
val result : MutableLiveData<SomeResult> = MutableLiveData()
fun someMethod() {
someMethodJob = viewModelScope.launch {
result.value = fooRepositoru.someMethod()
}
}
override fun onCleared() {
super.onCleared()
someMethodJob?.cancel()
}
然后在片段或活动中,我可以观察视图模型的结果。
fooViewModel.result.observe(viewLifecycleOwner, Observer {
从我的仓库层开始,所有的东西都可以是一个暂停函数,然后从视图模型开始,我可以调用任何一个暂停函数,但在我的视图模型中永远不会有公开的暂停函数。然后在视图模型中,我可以调用任何悬浮函数,但在我的视图模型中永远不会有一个公开暴露的悬浮函数。这是否是将coroutine与视图模型架构相结合的正确或恰当的方式?
这是将coroutines与视图模型架构结合起来的正确或恰当的方式吗?
是的!
视图模型的每个实例 ViewModel
有自己 ViewModelScope
.
宗旨 ViewModelScope
是在该生命周期内运行的作业。ViewModel
并负责在父节点的情况下自动取消正在运行的coroutine作业。Activity/Fragment
的 ViewModel
被销毁。
任何正在运行的工作在 ViewModelScope
时,将被取消。ViewModel
将被摧毁。
阅读更多 此处
private var someMethodJob : Job? = null val result : MutableLiveData<SomeResult> = MutableLiveData() fun someMethod() { someMethodJob = viewModelScope.launch { result.value = fooRepositoru.someMethod() } }
你可以放弃 都 的,只说
val result: LiveData<SomeResult> = liveData {
emit(fooRepository.someMethod())
}
然后观察 result
.