Android 我的Post请求的结果是用户的身份验证令牌。我想在应用程序的TextView中显示此令牌,但TextView未更新
//用于检索令牌-->的函数正在运行 对象常数{ //Opalen token van de user(请求符合用户名和密码,获取TokenModel和API服务Android 我的Post请求的结果是用户的身份验证令牌。我想在应用程序的TextView中显示此令牌,但TextView未更新,android,kotlin,Android,Kotlin,//用于检索令牌-->的函数正在运行 对象常数{ //Opalen token van de user(请求符合用户名和密码,获取TokenModel和API服务 fun getFetchedToken(username: String, password: String): String{ var fetchedToken: String = "" // wordt in deze functie als return uitkomst gegeven,
fun getFetchedToken(username: String, password: String): String{
var fetchedToken: String = "" // wordt in deze functie als return uitkomst gegeven, ophalen in mainactivity
// Create Retrofit
val retrofit = Retrofit.Builder()
.baseUrl("http://10.0.2.2:8000")
.addConverterFactory(GsonConverterFactory.create())
.build()
// Create Service
val service = retrofit.create(APIService.APIService::class.java)
// Create JSON using JSONObject
val jsonObject = JSONObject()
jsonObject.put("username", username) //deze krijgen van het loginscherm app, wordt nu meegegeven in mainactivity
jsonObject.put("password", password) //deze krijgen van het loginscherm app
// Convert JSONObject to String
val jsonObjectString = jsonObject.toString()
// Create RequestBody ( We're not using any converter, like GsonConverter, MoshiConverter e.t.c, that's why we use RequestBody )
val requestBody = jsonObjectString.toRequestBody("application/json".toMediaTypeOrNull())
CoroutineScope(Dispatchers.IO).launch {
// Do the POST request and get response
val response = service.loginUser(requestBody)
withContext(Dispatchers.Main) {
if (response.isSuccessful) {
val items = response.body()
if (items != null) {
println("items: ${items.key}")
val fetchedToken = items.key.toString()
println("fetchedToken as String: ${fetchedToken}")
}
} else {
Log.e("RETROFIT_ERROR", response.code().toString())
}
}
}
println("fetchted token voor return: ${fetchedToken}")
return fetchedToken
}
}
//我的主要活动.kt
类MainActivity:AppCompatActivity(){
}
//在这里,我希望使用返回的令牌更新textview,但它是空的。有人告诉我它与coroutine有关。我是初学者,所以我无法理解。getFetchedToken()的结果需要时间,设置textview时,状态为加载
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.coroutineScope.launch {
val getFetchedTokenUser = Constants.getFetchedToken(username = "test",
password = "test123")
println("val fetchedtoken: ${getFetchedTokenUser}")
withContext(Dispatchers.Main){
text_view_result.text = getFetchedTokenUser
}
}
}
getFetchedToken()的结果需要时间,设置textView时,状态为正在加载
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.coroutineScope.launch {
val getFetchedTokenUser = Constants.getFetchedToken(username = "test",
password = "test123")
println("val fetchedtoken: ${getFetchedTokenUser}")
withContext(Dispatchers.Main){
text_view_result.text = getFetchedTokenUser
}
}
}
当我将整个函数放在MainActivity.kt中时,它工作正常?。该函数位于一个单独的文件中,“val getfetchedToken”被“”覆盖,这就是为什么我什么也得不到的原因。getfetchedToken在return语句中,但它给了我“”。我想不出这比getfetchedToken()中设置的“getfetchedToken=”更好,然后启动一个CoroutineScope并在网络响应中更改fetchedToken,但在它更改之前,会调用return fetchedToken。是的,我看到了,但是我可以将带有fetchedToken的return放在哪里?您应该使您的函数挂起,并在CoroutineScope中调用它。当我将整个函数放在MainActivity.kt中时,它工作正常吗ion在一个单独的文件中,“val getfetchedToken”被“”覆盖,这就是为什么我什么也得不到的原因。fetchedToken在return语句中,但它给了我“”。我想不出它比你在getfetchedToken()中设置的fetchedToken=“”),然后启动一个CoroutineScope并在网络响应中更改fetchedToken,但在它更改之前,会调用return fetchedToken。是的,我看到了,但是我可以将带有fetchedToken的return放在哪里?您应该使函数挂起,并在CoroutineScope中调用它