0

我正在尝试使用TextView:)制作时钟

这里有人告诉我,我不能使用普通线程来更改 UI,但是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);
}
4

2 回答 2

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 更新。

于 2013-03-10T01:22:05.917 回答
2

在此处查看示例https://stackoverflow.com/a/11140429/808940

另请注意,您的代码中有重复的行:

clock.setText(""+millis);

It appears both in the runOnUiThread and in the main handler, it should only appear in the runOnUiThread runnable

于 2013-03-10T01:22:51.443 回答