1

連続スレッドを実行するために使用している次の方法があります。

public void createAndStartCountDownThread(){
    final Handler handler = new Handler();


    countDownThread=new Thread(new Runnable() {
        public void run() {
            int timeToBlink = 1000;
            try{Thread.sleep(timeToBlink);}catch (Exception e) {}
            handler.post(new Runnable() {
                public void run() {
                    if(isCountDownThreadRunning==0)
                        return; 
                    if(secondsUntilFinished!=0)
                        secondsUntilFinished--;

                    if(secondsUntilFinished==0)
                        onFinish();
                    else{

                        createAndStartCountDownThread();

                    }
                }
            });

        }
    });

    countDownThread.start();

}

基本的にこれが行うことは、タイマーのカウントダウンだけです。ただし、問題は、このメソッドを頻繁に呼び出すと、タイマーが 2 倍または 3 倍速く動き始めるため、このスレッドの複数のコピーが作成されているように見えることです。これが発生する理由がわかりません。既存の countDownThread を再割り当てしているように見えるため、新しいものを生成しないでください。私は何を間違っていますか?

4

1 に答える 1

3

ハンドラーの run 関数は createAndStartCountDownThread() を呼び出します。これにより、新しいスレッドが作成され、その上で start が呼び出されます。したがって、各スレッドはハンドラーに何かを投稿し、新しいスレッドを作成します。そうです、この関数は多くのスレッドを生成します。

何をしようとしているのかわかりませんが、これは間違った方法です。タイマーが必要な場合は、タイマーまたはアラームを使用します。継続的なスレッドを作成する場合は、ループを含む 1 つのスレッドが必要です (スレッドが実行を終了して途中で終了しないようにするため)。後で起こされたい場合 (そして後ですぐに起こされる場合) は、単に Handler を使用します。

編集:

点滅動作を実装しようとしている場合は、postMessageDelayed を介してメッセージが投稿された単一のハンドラーを使用することをお勧めします。これにより、指定された時間内に実行可能なハンドラーが実行されます。スレッドは関係ありません。すべてが UI スレッド上にあるため、そこから UI を変更できます。

于 2013-07-04T20:30:41.077 に答える