如何使用liveData协程块

时间:2019-07-19 09:03:57

标签: android-livedata

如何使用liveData协程块

官方文档

https://developer.android.google.cn/topic/libraries/architecture/coroutines#livedata

现在可以在liveData块中使用带有协程的livedata

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

当我尝试这样使用时

fun onLogin(v: View) {
    liveData(context = Dispatchers.IO) {
        val reqLogin = ReqLogin(account = account.value?:"", password = MD5(password.value?:""))
        val data = HttpManager.service(MobileApi::class.java).loginSuspend(reqLogin)
        emit(data.data!!)
    }
}

代码块中的代码未执行

搜索并发现liveData块始终用于分配

https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54

如果要刷新livedata值,可以使用“转换”之类的

LiveData<Repo> repo = Transformations.switchMap(repoIdLiveData, repoId -> {
    if (repoId.isEmpty()) {
        return AbsentLiveData.create();
    }
    return repository.loadRepo(repoId);
});

但是当我如何使用它 1.活动on从服务器恢复和刷新数据 2.某些点击事件触发了请求并显示了一些新数据

在我的登录场景中,使用viewModelScope似乎更有用

fun onLogin(v: View) {
    val reqLogin = ReqLogin(account = account.value ?: "", password = MD5(password.value ?: ""))
    viewModelScope.launch {
        val data = withContext(Dispatchers.IO) {
            HttpManager.service(MobileApi::class.java).loginSuspend(reqLogin)
        }
        _userInfo.value = data.data!!
        _isLogin.value = true
    }
}

1 个答案:

答案 0 :(得分:2)

    fun onLogin(v: View) {
    liveData(context = Dispatchers.IO) {
        val reqLogin = ReqLogin(account = account.value?:"", password = MD5(password.value?:""))
        val data = HttpManager.service(MobileApi::class.java).loginSuspend(reqLogin)
        emit(data.data!!)
    }
}

代码块未执行,因为文档指出

  

当LiveData变为活动状态并且处于活动状态时,代码块开始执行   LiveData在可配置的超时后自动取消   变得不活动。

您应该通过观​​察使其活跃起来。