android - 为什么尝试更改 TextView 或在 timerTask 中显示 toast 会卡住我的应用程序?

标签 android kotlin

import android.annotation.SuppressLint
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_track_income.*
import java.util.*
import kotlin.concurrent.timerTask

class TrackIncome : AppCompatActivity() {

    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_track_income)

        val time: TextView = findViewById(R.id.time)
        val money: TextView = findViewById(R.id.money)
        val timer: Timer = Timer()  
        val calculateTime = timerTask {
            val milliseconds = System.currentTimeMillis()
            var seconds: Int = (milliseconds / 1000).toInt()
            val minutes = 1
            seconds %= 60
            print("seconds are " + seconds.toString()) 
            time.text = String.format("%d.%d", minutes,seconds)

        }
        Timer("timer", false).schedule(calculateTime,1000, 1000)

    }
    fun showToast(){
    Toast.makeText(this, "Its toast!", Toast.LENGTH_SHORT).show()
    }
}

我注意到,如果我在 timerTask 对象中写入 time.text,或者尝试调用 showToast(),我的应用程序将会崩溃。

此外,当我尝试注释掉时 "time.text = String.format("%d.%d", minutes,seconds)" 并仅使用打印语句运行应用程序并检查 logcat,打印语句也没有出现。我已经阅读过人们使用 Timer 对象的其他示例,那么为什么我的方法不起作用?

最佳答案

Toast 是一个 UI 元素,因此它需要在 UI Thread 上运行,而不是在 background Thread

中运行

使用runOnUiThread

runOnUiThread(new Runnable() {
        public void run()
        {
            Toast.makeText(yourContext, "Your Message", Toast.LENGTH_SHORT).show();
        }
    });
}

关于android - 为什么尝试更改 TextView 或在 timerTask 中显示 toast 会卡住我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54001258/

相关文章:

java - 我应该使用哪种服务?

android - getChildFragmentManager > beginTransaction > 替换 > 提交 : no result

java - 使用 ItemTouchHelper 与 RecyclerView 中锁定的 ViewHolder 进行交互

java - Kotlin、Scala 和 Java 的 Gradle 构建失败

android - 我需要将数据从 Activity 输出到 fragment

java - 用 Kotlin 数据类替换 Java DTO 类的问题

java - ListView : disabling clicking/focus

android - 什么时候创建端点?

kotlin - 在声明挂起函数时传达预期的线程类型(IO、默认、主线程)

Android:LoadStateAdapter 不在 recyclerview 网格布局中居中