我在Android Studio中使用默认的LoginActivity并创建了一个简单的登录视图。在我的应用程序中,身份验证任务和访问令牌生成由服务器通过API调用完成。但是,由于api调用必须有一个完成块,doInBackground
中的登录功能也可以。因此,验证结果存在于完成块的线程中,这使得原始doInBackground
的返回结果为onPostExecute
不正确。功能被覆盖,因此我无法更改其参数和格式。我仍然是android开发的新手,并且仍然不太熟悉它的异步任务,所以我想问一下是否有任何方法可以在doInBackground
中停止并等待完成块中的结果?或者有没有更好的解决方案来解决我的API登录?感谢。
这里是我的UserLoginTask的代码(用kotlin编写,但我认为这个概念与java相同):
inner class UserLoginTask internal constructor(private val mUsername: String, private val mPassword) : AsyncTask<Void, Void, Boolean>() {
override fun doInBackground(vararg params: Void?): Boolean? {
var result = false
try {
Thread.sleep(2000)
} catch(e: InterruptedException) {
return false
}
MyLoginService().login(mUsername, mPassword, onCompleted = { token ->
// I want to get the login result from here and return it to onPostExecute
// It's no use if I change the result to true here because the result is already returned before completion.
})
return result
}
override fun onPostExecute(success: Boolean?) {
mAuthTask = null
showProgress(false)
if(success!!) {
finish()
} else {
mPasswordView!!.error = getString(R.string.error_incorrect_password)
mPasswordView!!.requestFocus()
}
}
override fun onCancelled() {
mAuthTask = null
showProgress(false)
}
}
答案 0 :(得分:2)
你可以这样做,但这不是一个好主意。在你的情况下,最好使用Rx或期货而不是AsyncTask
。
override fun doInBackground(vararg params: Void?): Boolean? {
val exchanger = Exchanger<Boolean>()
MyLoginService().login(mUsername, mPassword, onCompleted = { token ->
exchanger.exchange(token != null)
})
return try {
exchanger.exchange(false)
} catch (exception: InterruptedException) {
false
}
}