2011-08-02 16 views
0

私はそれ自身でいくつかのビューを含むカスタムビューを持っています。このコンテナビュー内のビューの1つがクリックされると、コンテナビュー内のTextViewも毎秒更新する必要がある「タイマー」スレッドが実行されるようにしました。私の問題は毎秒TextViewを更新したいときに発生します。明らかに、私が思ったほど簡単ではなかった。私はそうのような私のコンテナビュー内のRunnableを実装し、そしてボタンがタイマーを開始するためにクリックされたとき、スレッドを実行:ビューからUIスレッドで実行

public void run() { 
     while(runnning) { 
      // if one second has passed, update the Textview 
     } 
} 

私は基本的にそれはです意味典型的なことはできない - タッチビュー・外階層の例外を取得しますUIスレッドでは実行されません。ここではpost(Runnable)を使いたくないので、スレッドの最後まで1秒間更新する必要はないからです。また、アクティビティ全体をrunOnUiThread(Runnable)に渡すことは実際的ではありません。だから、誰かが私がこれをやってどうやって行くのか教えてもらえますか誰かが明確化を必要とするなら、私に教えてください!

答えて

0

あなたはAndroid AsyncTaskを使用します。何かを待っている間にこのタイプの定期的なGUIを更新するだけのAndroid固有の構造です。

doInBackgroundでタイマーを実行し、GUIを更新するときはいつでもpublishProgressを呼び出します。次に、onProgressUpdateでGUIを更新するだけです。 onProgressUpdateはGUIスレッド上で実行され、doInBackgroundはバックグラウンドスレッド上で自動的に実行されます。

+0

ありがとう、私はAsyncTasksでそれを理解した! – Brian

0

アクティビティ全体を渡すとはどういう意味ですか? UIを更新する(1秒後など)場合はいつでも、このスレッド内にタイマースレッドを作成して達成することができます。 runOnUIThread()

+0

私に明確にさせてください。私が上記で説明しているのは、私が作成したカスタムビューのViewを拡張したTimerです。タイマー内のボタンをクリックすると、タイマーを起動することができます。 runOnUiThread()がView内に存在しないため、あなたの答えは役に立ちません。 – Brian

関連する問題