从Coroutine返回值,而不需要runBlocking

时间:2020-06-27 11:13:24

标签: android kotlin kotlin-coroutines

主要活动:

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上的所有动画,隐藏键盘等。
  • 然后,来自数据处理的响应被发送回MainActivity
  • MainActivity然后正在处理响应,然后显示错误消息或转移到UserProfile

这就是我试图实现所有这些目的的方式,而我难以实现的唯一事情就是使它在不阻止UI的情况下运行,帮助我了解如何实现这一目标

我当时想解决此问题的正确方法是使用一个布尔值的MutableLiveData,该值将在MainActivity上具有一个侦听器,并且在viewModel内将根据来自存储库的响应值进行更改,但是也许有些我没有考虑过的其他解决方案

0 个答案:

没有答案