使用处理程序更新UI会冻结我的应用程序

时间:2013-03-10 01:03:51

标签: android android-ui android-handler

我正在尝试使用TextView创建一个时钟:)

有人告诉我,我无法使用普通线程来更改用户界面,但HandlerAsyncTask。我设法让它在几天前工作,但不是一致的线程。

现在我想要的是一个始终如一的线程,它总是改变我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);
}

2 个答案:

答案 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中