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);