0

我试图传递数组中的每个元素,并在 TextView 中延迟它们之间我尝试使用 Runnable & Handler 但它只显示最后一个如何以 5 秒的延迟分别传递每个元素......

class MainActivity : AppCompatActivity() {

    var array = arrayListOf("bizza","Dolma","Burger","Salut","Drinks","Sussie")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
         var ran = Runnable {
            firsttxtview.setText((array[0]).toString())
         }
         var hand = Handler()
         hand.postDelayed(ran, 3000)
}
4

3 回答 3

1

你可以试试这个

val textViewsArray = arrayListOf(firsttxtview,secondtxtview...)

textViewsArray.forEachIndexed { index, textView->

    Handler().postDelayed({
        activity.runOnUiThread {
           textView.setText((array[index]).toString())
        }
    }, 5000 * index)
}
于 2020-04-24T22:34:45.313 回答
0

您可以尝试使用 CountDownTimer。在此处查看有关如何使用它的更多信息。

于 2020-04-24T22:53:34.577 回答
0

每个android.os.Handler都有自己的线程与之关联。线程是一种昂贵的资源。在更好的编程技术中,您永远不应该为非常小的操作创建新线程。

Android 已经带有一个Dispatchers.MainCoroutineDispatcher,它永远在 UI 线程上运行。

您可以使用它直接将协程启动到 ui 线程中:

class MainActivity : AppCompatActivity() {

    private var job = Job()
    private var scope = CoroutineScope(Disptachers.Main + job)
    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if(!job.isActive) {
            job = Job()
            scope += job
        }
        ...
        val viewChangeJob = scope.launch { // can omit creating variable if you don't need
            delay(3_000)
            firsttxtview.setText(array[0])

            // or change text every 3 sec taking every element of array
            // for(item in array) {
            //     delay(3_000)
            //     firsttxtview.setText(item)
            // }
        }

    }

    override fun onDestroy() {
        job.cancel()
    }

在这里,您还可以完全控制作业,您可以取消它们或暂停它们等。它也会在活动被破坏后自行取消!

于 2020-04-25T03:12:04.183 回答