Android 为什么试图在timerTask内更改文本视图或显示祝酒词会冻结我的应用程序?

Android 为什么试图在timerTask内更改文本视图或显示祝酒词会冻结我的应用程序?,android,kotlin,Android,Kotlin,我注意到,如果我在timerTask对象中写入time.text,或者尝试调用showtoos(),我的应用程序将崩溃 此外,当我试图发表评论时 “time.text=String.format(“%d.%d”,分,秒)”并使用print语句运行应用程序,然后检查logcat,print语句也不会显示。我已经阅读了其他使用计时器对象的示例,为什么我的方法不起作用呢?Toast是一个UI元素,因此它需要在UI线程上运行,而不是在后台线程中运行 使用 计时器对象是一个单一的后台线程,因此它不能直接访

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

此外,当我试图发表评论时
“time.text=String.format(“%d.%d”,分,秒)”
并使用print语句运行应用程序,然后检查
logcat
,print语句也不会显示。我已经阅读了其他使用计时器对象的示例,为什么我的方法不起作用呢?

Toast
是一个UI元素,因此它需要在
UI线程上运行,而不是在
后台线程中运行

使用


计时器对象是一个单一的后台线程,因此它不能直接访问UI元素(如toast、textview)。

为什么你的应用程序冻结了

计时器任务应快速完成。如果计时器任务花费过多的时间来完成,它会“占用”计时器的任务执行线程。这反过来会延迟后续任务的执行,当(如果)有问题的任务最终完成时,后续任务可能会“聚集”并快速连续执行

最好的方法是在计时器完成后使用
处理程序
。像

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

    private Handler handler = new Handler();
从计时器中调用它:

使用Log.d()查看结果而不是打印。
    private Handler handler = new Handler();
handler = new Handler(getLooper()) {
        @Override
        public void handleMessage(Message msg) {
                Toast.makeText(this, "Its toast!", Toast.LENGTH_SHORT).show();
        }
    };
handler.sendMessage(messageObject);