Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建在UI线程Android中更新的秒表_Android_Multithreading_Textview_Handler - Fatal编程技术网

创建在UI线程Android中更新的秒表

创建在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

我一直在想如何制作一个精确到百分之一秒的定制计时器。我已经研究了许多其他类似的问题,并决定尝试使用线程和处理程序

这是我的自定义handleMessage方法:

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方法工作得很好。谢谢大家的帮助。