android - 为什么改造响应内部的价值与外部的价值不同?
问题描述
我看到很多关于同一个问题的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 从服务器获取值之前显示并执行函数(并返回初始值)
解决方案
userApi.login(r).enqueue
是一个异步调用,它将在另一个线程上运行。网络调用可能需要几毫秒或几秒钟,因此您不会立即得到结果。
代码按以下顺序发生:
- 您调用
userApi.login(r).enqueue
-> 网络调用在另一个线程上并行启动 - 你回来
Result.Success(fakeUser)
- 网络调用完成 -> 回调中的代码
onResponse
或被onFailure
执行
如您所见,您甚至在网络调用完成之前就返回了一个结果。您的日志显示相同。
推荐阅读
- reactjs - 如何在反应中从数组中获取动态表头?
- join - 如何在 Spring Webflux(IntelliJ)(Postgres 数据库)中加入(替代 Mapping)多个表?
- networking - IPv4 子网(又名 CIDR/“苹果酒”)紧凑表示法:任何 RFC?
- swift - SwiftUI:列表中的第一项始终显示在详细视图中
- flutter - 在 Firestore 中查询 doc 的子子项时,Flutter 操作被拒绝
- azure - Azure 中的 IIS 运行错误(解组)
- c# - 核心 API 3.1 模型的 ajax 调用为空
- c++ - app.exec() 不会在窗口关闭时返回
- pymssql - 在venv中创建数据库连接时pymssql没有响应
- node.js - polling-xhr.js:268 net::ERR_NAME_NOT_RESOLVED