0

私はカウンター(秒と分をカウントする)を持ち、ディスプレイ上で毎秒更新しようとしています。

onCreate私は拡張する私のクラスにこのコードを持っていますActivity:

timeOnCall = (TextView) findViewById(R.id.time);
minutes = seconds = 0;
timeOnCall.setText(minutes + ":" + seconds);

// Implements the timer
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        ++seconds;
        if (seconds == 60) {
            seconds = 0;
            ++minutes;
        }
        // Display the new time
        timeOnCall.setText(minutes + ":" + seconds);
    }
}, 1000, 1000);

残念ながら、次のエラーが表示されます。

android.view.ViewRoot$CalledFromWrongThreadException:threadビュー階層を作成したオリジナルのみがそのビューにアクセスできます。

すでにメソッドに含まれているため、これを修正する方法がわかりませんonCreate()。誰かが解決策を知っていますか?

4

3 に答える 3

0

これは、バックグラウンド スレッドなしで実行しようとしていることの完全なステップバイステップです。タイマーは別のスレッドを使用して更新を行うため、これはタイマーよりも優先されます。

http://developer.android.com/resources/articles/timed-ui-updates.html

于 2010-12-04T01:56:21.880 に答える
0

あなたはハンドラーでそれを行うことができます.これは何かライトです:

final Handler mHandler = new Handler();
final Runnable updateText = new Runnable() {
    public void run() {
        timeOnCall.setText(minutes + ":" + seconds);
    }
};

onCreate では、次を実行できます。

onCreate(Bundle b) {
...
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            ++seconds;
            if (seconds == 60) {
                seconds = 0;
                ++minutes;
            }

            // Display the new time
        mHandler.post(updateText);
        }
    }, 1000, 1000);
}
于 2010-12-04T01:39:10.410 に答える
0

別のスレッド内からテキストビューを変更しようとしているためです。そんなことはできません。テキストビューを所有するスレッドにメッセージを投稿する必要があります。

public void run()

これにより、UI を実行しているものとは別の新しいスレッドが開始されます。

編集: 探しているコードの例がオンラインでたくさんあります。「Androidスレッドメッセージハンドラー」のようなものをGoogleで検索してください。

于 2010-12-04T01:19:57.690 に答える