在UserLoginTask

时间:2016-03-31 08:26:42

标签: android android-asynctask kotlin

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

1 个答案:

答案 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
  }
}