主要活动:
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内将根据来自存储库的响应值进行更改,但是也许有些我没有考虑过的其他解决方案