首页 > 解决方案 > 为什么改造响应内部的价值与外部的价值不同?

问题描述

我看到很多关于同一个问题的stackoverflow,但我仍然停留在我的圈子里。

我正在尝试从 API 返回用户令牌。响应是成功的,我可以记录它。但我无法返回它,因为该函数将在入队完成之前返回(这是我的想法)

请看下面的代码:

fun login(username: String, password: String): Result<LoggedInUser> {

        val client = OkHttpClient.Builder().build()
        val retrofit = Retrofit.Builder()
            .baseUrl("https:api/customers/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
        val userApi= retrofit.create<UserApiKotlin>()
        var  pass: String ="SecYourPa$$"
        val r= UserRequestModel("coding", pass)
        var fakeUser = LoggedInUser(
            java.util.UUID.randomUUID().toString(), "Jane Doe",
            "gfgfgfgf", "trtrtr", "trtrtrtr", "abababababab"
        )
       var sss="1"
        userApi.login(r).enqueue(object : Callback<LoggedInUser> {
            override fun onResponse(
                call: Call<LoggedInUser>, response: Response<LoggedInUser>
            ) {
                fakeUser = LoggedInUser(
                    java.util.UUID.randomUUID().toString(), "Jane Doe",
                    "gfgfgfgf", "trtrtr", "trtrtrtr", "xcxcxcxc"
                )
                sss = "tttttt"
                fakeUser = response.body()!!
                Log.e("inside Retrofit", sss)
            }

            override fun onFailure(call: Call<LoggedInUser>, t: Throwable) {
                Log.e("fauluer", "Unable to submit post to API.")
            }
        })


    Log.e("outside retrofit", sss)
    return Result.Success(fakeUser)
}

这个输出表明它将在 api 从服务器获取值之前显示并执行函数(并返回初始值)

在此处输入图像描述

标签: androidkotlinretrofit2

解决方案


userApi.login(r).enqueue是一个异步调用,它将在另一个线程上运行。网络调用可能需要几毫秒或几秒钟,因此您不会立即得到结果。

代码按以下顺序发生:

  1. 您调用userApi.login(r).enqueue-> 网络调用在另一个线程上并行启动
  2. 你回来Result.Success(fakeUser)
  3. 网络调用完成 -> 回调中的代码onResponse或被onFailure执行

如您所见,您甚至在网络调用完成之前就返回了一个结果。您的日志显示相同。


推荐阅读