如何从协程派生变量?



我是一个初学者,很抱歉问了这个愚蠢的问题

我可以很容易地从协程输出数据到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}")**
}

日志:

  1. spl:[halfling, Heavenly Baker, 15,17,7]
  2. spl val:halfling,Heavenly Baker,15,17,7
  3. 名称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}")
}
}

最新更新