Android のストップウォッチ アプリケーションのコードは次のとおりです。
package com.google.labyrinth;
public class Tabalicious extends Activity implements OnClickListener, Runnable
{
TextView stopwatchCounter;
long startTime, stopTime;
Thread stopwatch;
Button buttonStart;
Button buttonStop;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView( R.layout.tabalicious );
stopwatchCounter = (TextView) findViewById ( R.id.txtStopwatchCounter );
buttonStart = ( Button ) findViewById ( R.id.buttonStart );
buttonStop = ( Button ) findViewById ( R.id.buttonStop );
buttonStart.setOnClickListener( this );
buttonStop.setOnClickListener( this );
buttonStop.setEnabled(false);
}
public void onClick(View viewClicked)
{
switch( viewClicked.getId() )
{
case R.id.buttonStart:
this.buttonStart.setEnabled(false);
this.buttonStop.setEnabled(true);
this.startTime = System.currentTimeMillis();
stopwatch = new Thread(this);
stopwatch.start();
break;
case R.id.buttonStop:
this.buttonStop.setEnabled(false);
this.buttonStart.setEnabled(true);
try {
stopwatch.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
}
public void run()
{
//Update after 5 seconds.
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.stopTime = System.currentTimeMillis();
this.stopwatchCounter.setText( String.valueOf( (this.stopTime - this.startTime) ) ); //<- Debugger Info: This line is at the top of the call stack.
}
}
問題は、アプリケーションを実行すると CalledFromWrongThread 例外が発生することです。
02-10 19:53:32.835: E/AndroidRuntime(18482): 致命的な例外: スレッド-10 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.view.ViewRoot$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。02-10 19:53:32.835: E/AndroidRuntime(18482):
android.view.ViewRoot.checkThread(ViewRoot.java:3092) 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.view.ViewRoot.invalidateChild(ViewRoot.java:677) 02-10 19:53:32.835: E/AndroidRuntime(18482):
Android.view.ViewRoot.invalidateChildInParent (ViewRoot.java:703) 02-10 19:53:32.835: E/AndroidRuntime (18482):
Android.view.ViewGroup.invalidateChild(ViewGroup.java:2597) 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.view.View.invalidate(View.java:5326) 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.widget.TextView.checkForRelayout(TextView.java:5761) 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.widget.TextView.setText(TextView.java:2814) 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.widget.TextView.setText(TextView.java:2682) 02-10 19:53:32.835: E/AndroidRuntime(18482):
android.widget.TextView.setText(TextView.java:2657) 02-10 19:53:32.835: E/AndroidRuntime(18482): com.google.labyrinth.Tabalicious.run(Tabalicious.java:144) 02- 10 19:53:32.835: E/AndroidRuntime(18482): java.lang.Thread.run(Thread.java:1027) で
何が起こっているのかよくわかりません。よろしくお願いします。ありがとう!