使用 Kotlin 在 Android Studio 中延迟后尝试执行行
Trying to execute line after delay in Android Studio with Kotlin
您好,我有一个 textView 元素,我正在尝试延迟更改其文本。
例如“你好”-> 等待 1 秒->“世界”-> 等待 1 秒->“你好吗?”
当我在一个单独的 kotlin 文件中的终端中使用我的代码时,它完全按照我想要的方式工作。
当我使用 MainActivity.kt 中的代码时,它会等待 1 秒并仅将文本值放入一次。
我认为它执行所有行 simultaneously.But 为什么终端和 ui 之间存在差异。
我的代码有一个 class 文件和 Main Activity
中的代码
class Ball (val Ball: TextView, val time: Long){
fun textChange(){
Handler().postDelayed({
Ball.text = (1..90).random().toString()
}, time)
}
}
并在 MainActivity
class MainActivity : AppCompatActivity() {
var resultsList = mutableListOf<Int>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fun playButtonPressed(view:View){
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
}
}
这样做,您要求显示 5 个字符串,但延迟相同。
在我看来,您必须使用 CountDownTimer 以固定间隔显示另一段文本。
这是一个示例代码
class Ball (val Ball: TextView, val messagesList: List<String>){
private var index = 0
fun textChange(interval: Long) {
val time = interval * messagesList.size
val timer = object: CountDownTimer(time, interval) {
override fun onTick(millisUntilFinished: Long) {
Ball.append(" " +messagesList[index++])
}
override fun onFinish() {
//nothing to do
}
}
timer.start()
}
}
class MainActivity : AppCompatActivity() {
var messageList = mutableListOf<String>("Hello", "World", "How are you ?")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fun playButtonPressed(view:View){
// will update the text every second during until the list is empty
Ball(textView, messageList).textChange(1000)
}
}
一个简单的方法是 post runnables 到 View
本身,因为它有自己的处理程序访问权限。
fun playButtonPressed(view:View){
repeat(5) { repeat ->
val number = (1..90).random().toString()
val delay = (repeat + 1) * 1000L // repeat starts at 0
Ball01.postDelayed({ Ball01.text = number }, delay)
}
}
此外,您正在创建一个全新的一次性 Ball
对象,只是为了调用 textChange
函数,没有必要这样做。如果你想在 Ball
class 中保留该行为,请将其粘贴在 companion object
中,然后你可以从 repeat
函数中调用 Ball.textChange(textView, delay)
您好,我有一个 textView 元素,我正在尝试延迟更改其文本。 例如“你好”-> 等待 1 秒->“世界”-> 等待 1 秒->“你好吗?”
当我在一个单独的 kotlin 文件中的终端中使用我的代码时,它完全按照我想要的方式工作。 当我使用 MainActivity.kt 中的代码时,它会等待 1 秒并仅将文本值放入一次。 我认为它执行所有行 simultaneously.But 为什么终端和 ui 之间存在差异。
我的代码有一个 class 文件和 Main Activity
中的代码class Ball (val Ball: TextView, val time: Long){
fun textChange(){
Handler().postDelayed({
Ball.text = (1..90).random().toString()
}, time)
}
}
并在 MainActivity
class MainActivity : AppCompatActivity() {
var resultsList = mutableListOf<Int>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fun playButtonPressed(view:View){
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
Ball(Ball01,1000).textChange()
}
}
这样做,您要求显示 5 个字符串,但延迟相同。
在我看来,您必须使用 CountDownTimer 以固定间隔显示另一段文本。
这是一个示例代码
class Ball (val Ball: TextView, val messagesList: List<String>){
private var index = 0
fun textChange(interval: Long) {
val time = interval * messagesList.size
val timer = object: CountDownTimer(time, interval) {
override fun onTick(millisUntilFinished: Long) {
Ball.append(" " +messagesList[index++])
}
override fun onFinish() {
//nothing to do
}
}
timer.start()
}
}
class MainActivity : AppCompatActivity() {
var messageList = mutableListOf<String>("Hello", "World", "How are you ?")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fun playButtonPressed(view:View){
// will update the text every second during until the list is empty
Ball(textView, messageList).textChange(1000)
}
}
一个简单的方法是 post runnables 到 View
本身,因为它有自己的处理程序访问权限。
fun playButtonPressed(view:View){
repeat(5) { repeat ->
val number = (1..90).random().toString()
val delay = (repeat + 1) * 1000L // repeat starts at 0
Ball01.postDelayed({ Ball01.text = number }, delay)
}
}
此外,您正在创建一个全新的一次性 Ball
对象,只是为了调用 textChange
函数,没有必要这样做。如果你想在 Ball
class 中保留该行为,请将其粘贴在 companion object
中,然后你可以从 repeat
函数中调用 Ball.textChange(textView, delay)