有很多关于架构组件、kotlin和协程的信息,但我找不到一个将所有这些东西结合在一起的示例。我正在苦苦思索如何结合使用here和协程来使用安卓的架构组件。我有一个想法,但我不确定这是否是实现这种架构风格的正确方式。我尝试将视图模型+存储库模式与复古拟合和协程结合使用。
我有以下存储库:
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是一个挂起的方法,所以我需要将它包装在一个协程作用域中:
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 {从我的存储库层开始,下面的一切都可以是一个挂起的函数。然后,从视图模型中,我可以调用任何挂起函数,但在我的视图模型中永远不会有公开公开的挂起函数。这是将协程与视图模型架构结合在一起的正确或适当的方式吗?
发布于 2020-06-03 05:19:52
这是将协程与视图模型架构结合的正确或适当的方式吗?
是!
每个ViewModel实例都有自己的ViewModelScope。
ViewModelScope的目的是在该ViewModel的生命周期中运行作业,并在ViewModel的父Activity/Fragment被破坏的情况下自动取消正在运行的协程作业。
销毁ViewModel时,ViewModelScope下运行的任何作业都将被取消。
阅读更多here
发布于 2020-06-05 16:33:22
私有变量someMethodJob : Job?=空值结果: MutableLiveData = MutableLiveData() fun someMethod() { someMethodJob = viewModelScope.launch { result.value = fooRepositoru.someMethod() }}
你可以去掉所有的,然后说
val result: LiveData<SomeResult> = liveData {
emit(fooRepository.someMethod())
}然后观察result。
https://stackoverflow.com/questions/62160808
复制相似问题