我正在尝试安排一项任务,每秒更新一次TextView。只要我有这条线,随后注释,注释掉,一切正常。 Logcat显示如下:
Task
IN
OUT
Task
IN
OUT
...
但如果我取消注释statusLabel.setText(),这就是我所看到的:
Task
IN
OUT
TASK
IN
这五行都是我得到的。出于某种原因,它似乎停止了,当它第二次尝试再次设置文本时。
我的代码:
public class MyActivity extends Activity {
TextView statusLabel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.control);
statusLabel = (TextView) findViewById(R.id.statusLabel);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
new Runnable() {
public void run() {
Log.d("Datalogger","Task");
updateStatus();
}
}, 0, 1, TimeUnit.SECONDS);
}
private void updateStatus() {
Log.d("Datalogger","IN");
statusLabel.setText("X"); // !! If I comment out this line,
Log.d("Datalogger","OUT"); // everything works
}
}
答案 0 :(得分:2)
问题是您正在尝试从UI(主)线程以外的线程更新UI。在runnable中使用runOnUiThread(Runnable action),使用new runnable调用updateStatus()。
答案 1 :(得分:1)
您无法从后台线程更新UI。在日志中甚至应该出现错误。使用Activity#runOnUiThread(Runnable)