0

私はTextView:)を使って時計を作ろうとしています

ここの誰かが、通常のスレッドを使用して UI を変更することはできないと言っていましたが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);
}
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);

runOnUiThread とメイン ハンドラーの両方に表示されます。runOnUiThread ランナブルにのみ表示されます。

于 2013-03-10T01:22:51.443 に答える