UserLoginTask完成登录API完成块后,如何返回doInBackground中的结果

我在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) } } 

你可以做到这一点,但这不是一个好主意。 在你的情况下,最好使用像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 } }