0

カウントダウン中にボタンのテキストを設定できないという問題があります。これは次のコードです。

begin.setText("Start level 1");
begin.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {

final int delay = 0000; // delay for 5 sec.
final int period = 1000; // repeat every sec.
final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public  void run() {
        begin.setText("" + t);
        t--;
        if(t == 0) {
            timer.cancel()
        }
    }
}, delay, period);

これはlogcatです:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.View.requestLayout(View.java:8128)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.View.requestLayout(View.java:8128)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.View.requestLayout(View.java:8128)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.View.requestLayout(View.java:8128)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.view.View.requestLayout(View.java:8128)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.widget.TextView.checkForRelayout(TextView.java:5405)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.widget.TextView.setText(TextView.java:2712)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.widget.TextView.setText(TextView.java:2580)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at android.widget.TextView.setText(TextView.java:2555)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at it.bisemanuDEV.piano.livello1$1$1.run(livello1.java:134)
07-30 17:27:05.273: E/AndroidRuntime(22543):    at java.util.Timer$TimerImpl.run(Timer.java:289)

お役に立てば幸いです。ありがとう

4

2 に答える 2

2

@ Jug6ernautが述べたように、を使用しないでくださいTimerTask
代わりに、を使用してみることができますHandler。これが私がタイマーでそのようなことをする方法です。

たとえば、電話をかけたいときのタイマーで、次のようにします.setText()

mHandler.post(new Runnable() {
    @Override
    public void run() {
        begin.setText(gcalendar.get(Calendar.MINUTE)+":"+gcalendar.get(Calendar.SECOND));   
    }
});

単純にとして初期化されHandler mHandler = new Handler()ます。

編集:これはあなたの答えの下のコメントに投稿された他のSO質問リンクと同じ考えであることに気づきました...まあ、とにかくここにあります。

于 2012-07-30T15:29:12.350 に答える
0

TimerTaskこれの代わりに使用してください。ドキュメントによると、The TimerTask class represents a task to run at a specified time. The task may be run once or repeatedly。まさにあなたが探しているもの。の使用例はここTimerTaskにあります。

于 2012-07-30T15:08:09.333 に答える