创建在UI线程Android中更新的秒表
我一直在想如何制作一个精确到百分之一秒的定制计时器。我已经研究了许多其他类似的问题,并决定尝试使用线程和处理程序 这是我的自定义handleMessage方法:创建在UI线程Android中更新的秒表,android,multithreading,textview,handler,Android,Multithreading,Textview,Handler,我一直在想如何制作一个精确到百分之一秒的定制计时器。我已经研究了许多其他类似的问题,并决定尝试使用线程和处理程序 这是我的自定义handleMessage方法: public void handleMessage(Message msg) { String timeText = msg.getData().getString("time"); watch.setText(timeText); } watch对象只是在onCreate()中初始化的TextView 这是我的run
public void handleMessage(Message msg) {
String timeText = msg.getData().getString("time");
watch.setText(timeText);
}
watch对象只是在onCreate()中初始化的TextView
这是我的run方法的主要部分:
while(true) {
long timeElapsed = System.currentTimeMillis() - startTime;
int hundreths = (int)((timeElapsed % 1000) / 10);
int seconds = (int)((timeElapsed % 60000) / 1000);
int minutes = (int)(timeElapsed / 60000);
Bundle bundle = new Bundle();
bundle.putString("time", String.format("d:%02d.%02d", minutes, seconds, hundreths));
Message msg = handler.obtainMessage();
msg.setData(bundle);
handler.handleMessage(msg);
}
我意识到使用处理程序背后的整个想法是,只有UI线程可以更新屏幕上的元素,但我仍然收到一个CalledFromErrorThreadException,其中包含一条消息,即只有开始创建视图层次结构的原始线程才能对其调用方法。我不清楚我到底做错了什么。我认为你的错误是因为你使用的是handleMessage而不是sendMessage 一种更简单的方法可能是使用runOnUiThread方法并放弃处理程序
)Azertii是对的,您必须调用
sendMessage()
而不是handleMessage()
。如果您希望在UI线程中发生某些事情,那么必须从那里调用该方法-如果您首先将消息发送给UI线程处理程序,处理程序会为您执行该操作。如果你直接从后台线程调用它,那么它会在后台线程中执行,所有的事情也会从那里执行,等等。好吧,我现在明白我的错误了。如果我使用runOnUiThread方法,我会从接受runnable的Ui方法调用它吗?我担心的是,它会干扰Ui线程,因为循环是连续的?如果使用runUnuithRead,传递的runnable将在另一个线程上执行。对UI线程没有干扰。您可以在任何地方使用runOnUiThread
,在Runnable
中的run()
中的代码将始终在UI线程上执行。从UI线程使用它是没有意义的:)在您的情况下,您将在循环中使用它,而不是在处理程序中使用它。而且它并没有真正干扰ui线程,因为它本身使用了处理程序。发送的不是消息
,而是Runnable
。所以我现在尝试了这里描述的两种方法。runOnUiThread更新TextView的速度很慢,但是Thread+Handler方法工作得很好。谢谢大家的帮助。