使用viewmodelScope启动进行生命周期转换

时间:2019-09-24 12:02:55

标签: android kotlin android-livedata android-viewmodel

我在项目中使用以下版本-

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha04"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha04"

所以在我的View Model类中-

fun initView() =
        Transformations.map(domain.performOperation()) {
            when (it) {
                ...
            }
        }

“我的视图模型”类扩展了“基本视图模型”类,“基本视图模型”类如下所示-

open class BaseViewModel(private val coroutineCtx: CoroutineContext = Dispatchers.Main) :
    ViewModel(),
    CoroutineScope {

    private val job = SupervisorJob()

    override val coroutineContext: CoroutineContext
        get() = coroutineCtx + job

    override fun onCleared() {
        super.onCleared()
        job.cancel()
    }
}

这似乎可行,但我想即兴编写代码并摆脱Base View Model类中的样板协程代码。因此,我想直接在“我的视图模型”类中使用viewModelScope.launch。但是如何与Transformations.map一起使用它?

1 个答案:

答案 0 :(得分:0)

因此,如果我没事的话,也许这样的解决方案可以为您提供帮助:

您的活动/片段

lifecycleScope.launchWhenStarted {
        val apiResult = viewModel.initView()
        updateUI(apiResult)
        }

在您的ViewModel中

private val apiDeferred = CompletableDeferred<LiveData<APIResult>>()

suspend fun initView(): LiveData<APIResult> {
        viewModelScope.launch(Dispatchers.IO) {
            val apiResult = domain.performOperation()
            artsDeferred.complete(arts)
        }
        return apiDeferred.await()
    }

您还可以在这里查看此视频:https://www.youtube.com/watch?v=BOHK_w09pVA&t=1230s(22分钟后)

请说出是否适合您,我也可以建议使用最新技术协程,liveData等的其他解决方案