2010-12-04 7 views
0

私は、カウンタ(秒と分をカウントする)を持っていて、毎秒ディスプレイ上でそれを更新しようとしています。Android:タイマーでXML要素を変更する

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

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()メソッドにあるので、これを修正する方法がわかりません。誰かが解決策を知っていますか?

答えて

0

、このliteの何か:

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); 
} 
+0

ありがとうございます!非常に便利! – James

0

その理由は、あなたが別のスレッドの中からテキストビューを変更しようとしているからです。あなたはそれをすることはできません。テキストビューを所有するスレッドにメッセージをポストバックする必要があります。

public void run() 

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

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

+0

ありがとうございます。私はそれを行う方法がわかりません、あなたは私のためのチュートリアルや例がありますか?それはたくさんの助けになります。ありがとう! – James

+0

.setText()を実行する新しいスレッドであるはずの "new TimerTask"ですか? – James

+0

作成した新しいスレッドのrunメソッドにコード全体を入れました。それでもクラッシュします。 – James

0

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

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

+0

ありがとうございました! – James

関連する問題