1

Android アプリ (QR コード リーダー) を作成していますが、1 秒間に 4 回何らかのアクションを実行する必要があります。この目的のために Timer クラスを使用することにしました。私はそれの奇妙な振る舞いを発見しました:

timer = new Timer();
timer.scheduleAtFixedRate(onTimer, 100, stn.GetStep());
timer.cancel();
timer = new Timer();
timer.scheduleAtFixedRate(onTimer, 100, stn.GetStep());

最後の行でエラー - がスローされますjava.lang.IllegalStateException: TimerTask is scheduled already。変じゃない?

4

2 に答える 2

3

いいえ、それが機能するはずです。ATimerTaskは 1 回限りのオブジェクトです。TimerTaskコードを再度スケジュールする場合は、新しく作成します。(ドキュメントを参照してください。)

実行ごとにまったく新しいオブジェクトを作成するという考えが気に入らない場合は、次のようなことができます

Runnable toRunRepeatedly = new Runnable() {
    public void run() {
        // your code goes here...
    }
};

そして、する

TimerTask tt = new TimerTask() {
    public void run() {
        // Delegate to the same runnable each time.
        toRunRepeatedly.run();
    }
};

関連する質問:

于 2012-07-04T11:43:50.477 に答える
0

短い答え: いいえ、変ではありません。

これはスレッドであり、「キャンセル」状態になりますが、ステートメントが迅速に実行されるため、スレッドはまだキャンセルされません。101 のスレッドへようこそ。

スレッドをキャンセルして再度呼び出すのはなぜですか? これはどのような目的に役立ちますか? もう一度呼び出す前に、最初のインスタンスに安全に停止する時間を与えていません。再作成する前に、タイマー オブジェクトを null に設定することをお勧めします。

于 2012-07-04T11:46:20.793 に答える