android - 没有 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上的所有动画都完成了,键盘被隐藏了等等。
- 然后将来自数据处理的响应发送回 MainActivity
- MainActivity 然后处理响应,然后它要么显示错误消息,要么传输到 UserProfile
这就是我试图实现这一切的方式,我唯一难以实现的就是让它在不阻塞 UI 的情况下运行,帮助我了解如何实现这一点
我在想解决这个问题的正确方法是一个带有布尔值的 MutableLiveData,它将在 MainActivity 和 viewModel 上有一个监听器,它会根据来自 Repository 的响应值而改变,但也许还有其他一些解决方案这个我没有考虑过
解决方案
推荐阅读
- javascript - 从网页上的其他设备访问相机
- html - 引导卡对齐不正确
- javascript - 如何删除作为对象一部分的数组中的消息
- php - PHP Laravel Trix 所见即所得如何显示数据库中的内容
- python - 使用 imageio 或 pyautogui 截屏时包含鼠标光标?
- blockchain - 退还所有在solidity合约上输入的地址
- r - 如何在同一张图中绘制“计数”和“身份”
- python - 在 keras ImageDataGenerator.flow() 中使用多输出标签并使用 model.fit_generator()
- nsis - 具有 UNC 路径的 NSIS CopyFiles
- jquery - 点击时传递参数会出错