首页 > 解决方案 > 没有 runBlocking 的协程返回值

问题描述

主要活动:

btLogin.setOnClickListener {
            hideKeyboard()
            if (etUsername.text.toString().isEmpty() || etPassword.text.toString().isEmpty()) {
                etPasswordInput.error = resources.getString(R.string.main_enter_user_data)
            } else if (viewModel.userLogin(
                    etUsername.text.toString(),
                    etPassword.text.toString(),
                    cbRememberMe.isChecked
                )
            ) {
                //val user: Array<String> = viewModel.getUserLoginData()
                val intent: Intent = Intent(this, ProfilePageActivity::class.java)
                intent.putExtra("EXTRA_USERNAME", "111111")
                intent.putExtra("EXTRA_PASSWORD", "222555")
                startActivity(intent)
                finish()
            }
            else{
                etPasswordInput.error = resources.getString(R.string.main_wrong_username_or_password)
            }
        }

MainActivityViewModel:

class MainActivityViewModel : ViewModel() {

    fun userLogin(username: String, password: String, remember: Boolean): Boolean {
        return Repository.userLogin(username, password, remember)
    }

    fun getUserLoginData(): Array<String> {
        val array: Array<String> = arrayOf(
            Repository.getStoredUsername(),
            Repository.getStoredPassword()
        )
        return array
    }
}

存储库:

fun userLogin(username: String, password: String, remember: Boolean): Boolean {
        var response = false
        var responseLogin = ""
        runBlocking {
            job_login = CoroutineScope(IO).launch {
                responseLogin = HUC.httpRequest_Profile(username, password.md5())
                if (responseLogin.contains(loginSuccess)) {
                    if (remember) {
                        preferences.saveUser(
                            username,
                            password,
                            password.md5()
                        )
                    }
                    response = true
                }
            }
            job_login!!.join()
        }
        return response
    }

这就是我尝试实现用户登录的方式,它工作正常,但是,它阻塞了我的 UI 线程,直到 HTTP 请求完成,这导致按下按钮后立即冻结,这对用户体验不是很好。

这是我想做的事情:

这就是我试图实现这一切的方式,我唯一难以实现的就是让它在不阻塞 UI 的情况下运行,帮助我了解如何实现这一点

我在想解决这个问题的正确方法是一个带有布尔值的 MutableLiveData,它将在 MainActivity 和 viewModel 上有一个监听器,它会根据来自 Repository 的响应值而改变,但也许还有其他一些解决方案这个我没有考虑过

标签: androidkotlinkotlin-coroutines

解决方案


推荐阅读