【问题标题】:Get return value from a function that relies on an asynchronous task从依赖于异步任务的函数中获取返回值
【发布时间】:2021-04-04 04:55:42
【问题描述】:

我正在使用 Ion 进行 REST API 调用以登录用户。为了做到这一点,我得到了 Ion 返回给我的 accessToken(这是异步的)。最初,我在活动和回调中做所有事情(我得到了 accessToken,然后开始一个新的活动意图,同时将此令牌发送到下一个活动)。那样工作得很好。 现在,我将我的项目重构为 MVP 架构,因此我将 Ion 网络调用拆分为不同的类(在 MVP 的模型层级别)。但是,我有一个问题。它总是返回 null 我怀疑这是因为函数在 Ion 完成其异步任务之前返回。有什么想法吗?

这是我想从中获取 loginSession 的函数:

override fun userAuth(username: String,
                      password: String,
                      context: Context): LoginSession? {

    var loginSession: LoginSession? = null

    Ion.with(context)
            .load("https://myURL")
            .setBodyParameter("UserName", username)
            .setBodyParameter("Password", password)
            .asString()
            .setCallback { e, result ->
                try {
                    val json = JSONObject(result)
                    val expiresIn = json.getInt("expires_in")
                    val tokenType = json.getString("token_type")
                    val refreshToken = json.getString("refresh_token")
                    val accessToken = json.getString("access_token")
                    loginSession = LoginSession(expiresIn, tokenType, refreshToken, accessToken)

                } catch (jsonException: JSONException) {
                    jsonException.printStackTrace()
                }
            }
    return loginSession
}

【问题讨论】:

标签: android kotlin asynchronous return mvp


【解决方案1】:

创建一个接口,让你想要回调的类实现它。一旦你完成了模型内部的网络调用。 使用该接口的方法在您的活动/片段中获取回调。

您的模型中必须有对该接口的引用,该接口必须在您的网络调用开始处理之前使用您的活动/片段对象进行初始化。

注意:- 您的网络调用必须在 MVP 中的 Presenter 中,而不是在模型中。Retrofit 已经按照我的解释更轻松地完成了这一切。您可以使用 Retrofit 而不是 Ion。

【讨论】:

    猜你喜欢
    • 2018-04-09
    • 2017-12-16
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多