我觉得这里一定缺少一些简单的东西。我试图返回登录令牌,以便可以在整个应用程序中使用它。在onResponse方法中,登录令牌可以很好地打印到控制台,但是当我尝试返回该令牌时,我不能。
lateinit var authToken: String
fun getAuthToken(user: User): String {
sendPostRequest(user.username, user.password)
return authToken
}
fun sendPostRequest(userName: String, password: String): String {
var rb = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("username", userName)
.addFormDataPart("password", password)
.build()
val request = Request.Builder().url(URL_AUTH_ADDRESS).post(rb).build()
Log.d("request", request.toString())
val client = OkHttpClient()
var responseAuth = ""
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call?, response: Response?){
val body = response?.body()?.string()
authToken = response?.body()?.string()!!
Log.d("usersAuthToken", body)
}
override fun onFailure(call: Call?, e: IOException?) {
authToken = "fail"
}
})
Log.d("outside method", "resp: " + authToken)
return authToken
}
如上所示,这将崩溃,说明authToken从未初始化。但是,当我删除return语句时,该Log.d("usersAuthToken", body)
语句会像应有的那样打印令牌。
最终目标是使authToken在登录后在整个应用程序中持续存在。我在Kotlin领域非常环保,因此,如果我缺少更好的方法,请告诉我!
您试图在sendPostRequest
完成异步函数之前返回令牌。您应该将getAuthToken
和sendPostRequest
功能更改为以下内容:
import kotlinx.coroutines.*
lateinit var authToken: String
fun getAuthToken(user: User): String {
runBlocking {
sendPostRequest(user.username, user.password)
}
return authToken
}
suspend fun sendPostRequest(userName: String, password: String): String {
var rb = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("username", userName)
.addFormDataPart("password", password)
.build()
val request = Request.Builder().url(URL_AUTH_ADDRESS).post(rb).build()
Log.d("request", request.toString())
val client = OkHttpClient()
var responseAuth = ""
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call?, response: Response?){
val body = response?.body()?.string()
authToken = response?.body()?.string()!!
Log.d("usersAuthToken", body)
}
override fun onFailure(call: Call?, e: IOException?) {
authToken = "fail"
}
})
Log.d("outside method", "resp: " + authToken)
return authToken
}
suspend
用于指定它是否为异步函数,runBlocking
并用于使线程等待直到该函数完成运行。
您还应该在build.gradle
文件中添加以下内容以添加coroutines
依赖项:
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
}
并确保您使用最新的Kotlin版本:
buildscript {
ext.kotlin_version = '1.3.50'
}
确保存储库列表中包含jcenter()或mavenCentral():
repository {
jcenter()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句