我正在尝试使用TextView
创建一个时钟:)
有人告诉我,我无法使用普通线程来更改用户界面,但Handler
或AsyncTask
。我设法让它在几天前工作,但不是一致的线程。
现在我想要的是一个始终如一的线程,它总是改变我Textview
的文本。我试过用这个,但没有用,有什么帮助吗?
private void startClock() {
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
while (true) {
final long millis = System.currentTimeMillis() - MainActivity.startedAt;
clock.setText("" + millis);
runOnUiThread (new Runnable() {
@Override
public void run() {
clock.setText("" + millis);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}, 2000);
}
答案 0 :(得分:4)
你应该摆脱:
while(true) {
....
sleep(1000);
...
}
因为这会让你的线程永远陷入困境。你的程序应该像这样工作:
private Handler mHandler = new Handler();
@Override
public void onResume() {
super.onResume();
mHandler.removeCallbacks(mUpdateClockTask);
mHandler.postDelayed(mUpdateCLockTask, 100);
}
@Override
public void onPause() {
super.onPause();
mHandler.removeCallbacks(mUpdateClockTask);
}
private Runnable mUpdateClockTask = new Runnable() {
public void run() {
updateClock();
mHandler.postDelayed(mUpdateClockTask, 2000);
}
};
并在updateClock()
内部执行所有UI更新。
答案 1 :(得分:2)
在这里查看示例https://stackoverflow.com/a/11140429/808940
另请注意,代码中有重复的行:
clock.setText(""+millis);
它出现在runOnUiThread和主处理程序中,它应该只出现在runOnUiThread runnable中