我是一个初学者,很抱歉问了这个愚蠢的问题
我可以很容易地从协程输出数据到View元素(例如,在TextView中),但是我不能把它保存在变量中。
p。只有当你先保存到TextView,然后从那里获取数据:
它不工作:
lateinit var bind: ActivityMainBinding
val scope = CoroutineScope(Dispatchers.Default)
var name2 = ""
var race2 = ""
var dexterity2 = ""
var wisdom2 = ""
var strength2 = ""
fun expData() {
scope.launch {
val apiData = URL(CHARACTER_DATA_API).readText()
withContext(Dispatchers.Main) {
var spl = apiData.split(",")
**Log.d("MyTag","spl:${spl}")**
name2 = spl[0]
race2 = spl[1]
dexterity2 = spl[2]
wisdom2 = spl[3]
strength2 = spl[4]
**Log.d("MyTag","spl val:${spl[0]},${spl[1]},${spl[2]},${spl[3]},${spl[4]}")**
}
}
}
bind.butGenerate.setOnClickListener {
expData()
**Log.d("MyTag","names var: ${name2},${race2},${dexterity2},${wisdom2},${strength2}")**
}
日志:
- spl:[halfling, Heavenly Baker, 15,17,7]
- spl val:halfling,Heavenly Baker,15,17,7
- 名称var:…
我痛苦了第二天,我找不到答案。如何正确地做。请帮助!(Т_Т)
是:
lateinit var bind: ActivityMainBinding
val scope = CoroutineScope(Dispatchers.Default)
fun fetchCharacterData(bind: ActivityMainBinding){
scope.launch {
val apiData = URL(CHARACTER_DATA_API).readText()
withContext(Dispatchers.Main) {
val spl = apiData.split(",")
bind.run {
txtName.text = spl[0]
txtRace.text = spl[1]
txtDexterity.text = spl[2]
txtWisdom.text = spl[3]
txtStrength.text = spl[4]
}
}
}
,它工作:
lateinit var bind: ActivityMainBinding
val scope = CoroutineScope(Dispatchers.Default)
fun fetchCharacterData(bind: ActivityMainBinding){
scope.launch {
val apiData = URL(CHARACTER_DATA_API).readText()
withContext(Dispatchers.Main) {
val spl = apiData.split(",")
bind.run {
txtName.text = spl[0]
txtRace.text = spl[1]
txtDexterity.text = spl[2]
txtWisdom.text = spl[3]
txtStrength.text = spl[4]
}
}
}
val name = bind.txtName.text
val race = bind.txtRace.text
val dex = bind.txtDextirity.text
val wis = txtWisdom.text
val str = txtStrength.text
但是在我看来,这太长了,不正确
!现在它工作了=):
lateinit var bind: ActivityMainBinding
val scope = CoroutineScope(Dispatchers.Default)
var name2 = ""
var race2 = ""
var dexterity2 = ""
var wisdom2 = ""
var strength2 = ""
fun expData() {
scope.launch {
val apiData = URL(CHARACTER_DATA_API).readText()
withContext(Dispatchers.Main) {
var spl = apiData.split(",")
**Log.d("MyTag","spl:${spl}")**
name2 = spl[0]
race2 = spl[1]
dexterity2 = spl[2]
wisdom2 = spl[3]
strength2 = spl[4]
**Log.d("MyTag","spl val:${spl[0]},${spl[1]},${spl[2]},${spl[3]},${spl[4]}")**
}
}
}
bind.butGenerate.setOnClickListener {
expData()scope.launch {
withContext(Dispatchers.Main) {
while (name.isBlank()) {
delay(20)
}
**Log.d("MyTag","names var: ${name2},${race2},${dexterity2},${wisdom2},${strength2}")**
}
在以下代码中:
bind.butGenerate.setOnClickListener {
expData()
**Log.d("MyTag","names var: ${name2},${race2},${dexterity2},${wisdom2},${strength2}")**
}
您在expData()
方法中启动一个协程,并在此之后记录结果。这是行不通的,因为协程是异步的,当到达日志语句时变量将为空。
如果你想在变量初始化后执行一些代码,你需要在协程块中执行:
bind.butGenerate.setOnClickListener {
scope.launch {
val apiData = URL(CHARACTER_DATA_API).readText()
withContext(Dispatchers.Main) {
var spl = apiData.split(",")
name2 = spl[0]
race2 = spl[1]
dexterity2 = spl[2]
wisdom2 = spl[3]
strength2 = spl[4]
}
// ... EXECUTE YOUR CODE HERE
// ALL VARIABLES WILL BE INITIALIZED HERE
Log.d("MyTag","names var: ${name2},${race2},${dexterity2},${wisdom2},${strength2}")
}
}