【问题标题】:Trying to execute line after delay in Android Studio with Kotlin尝试在使用 Kotlin 在 Android Studio 中延迟后执行行
【发布时间】:2021-07-22 19:27:16
【问题描述】:

您好,我有 textView 元素,我正在尝试通过延迟更改其文本。 例如“你好” -> 等待 1 秒 -> “世界” -> 等待 1 秒 -> “你好吗?”

当我在终端中的单独 kotlin 文件中使用我的代码时,它完全按照我想要的方式工作。 当我在 MainActivity.kt 中使用代码时,它会等待 1 秒并且只放置一次文本值。 我认为它同时执行所有行。但是为什么终端和ui之间存在差异。

我的代码在 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()

    }
}

【问题讨论】:

  • If 将执行五次,有 1000 毫秒的延迟,但只有最后一个完成才会真正将文本更改为它的持续时间。你对这样做有一个错误的想法。

标签: android android-studio kotlin android-handler


【解决方案1】:

一种简单的方法是将可运行文件发布到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 类中,请将其粘贴在companion object 中,然后您可以从该repeat 函数中调用Ball.textChange(textView, delay)

【讨论】:

    【解决方案2】:

    这样做,您要求显示 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)
        }
    }
    

    【讨论】:

    • 问题是所有五个字符串都会“显示”,但其中 4 个字符串会在一段不可见的时间内可见。只有最后一个会真正获胜并保持可见。
    • 查看我编辑的答案,我添加了示例代码
    • 不尝试解决这部分问题 - "Hello" -&gt; waits 1 second -&gt; "World" -&gt; waits 1 second -&gt; "How are you?"
    • 不尝试解决这部分问题 - “你好” -> 等待 1 秒 -> “世界” -> 等待 1 秒 -> “你好吗?”我举了一个简单的例子,我真正的问题要复杂得多
    • @SerdarÇivi,看另一个例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多