1

TimerTask がスレッドでどのように機能しているのか疑問に思っていました。

たとえば、UI スレッドで実行される「run」メソッドを持つ TimerTask を実行するコードがあります。

class looper extends TimerTask {

    public looper() {

    }

    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                timer.schedule(new looper(), new Date(new Date().getTime() + 100));
            }
        });
    }
}

タイマーは次のように開始します。

    timer = new Timer();
    timer.schedule(new looper(), new Date());

TimerTask は新しいスレッドを作成しますか? もしそうなら、どのように機能しrunOnUiThreadますか?コードを UI スレッドに移動しますか?

TimerTask を再度呼び出す必要をなくし ( timer.schedule)、内部で無限ループを使用runして計算を行うようにしましたが、UI スレッドがブロックされ、アプリが応答しなくなります。

PS - UI を更新する必要があるため、UI スレッドでコードを実行する必要があります。

それで、ここで何が起こっているのですか?

4

1 に答える 1

2

ご質問について:

  • runOnUiThreadドキュメントから:

    指定されたアクションを UI スレッドで実行します。現在のスレッドが UI スレッドの場合、アクションはすぐに実行されます。現在のスレッドが UI スレッドでない場合、アクションは UI スレッドのイベント キューにポストされます。

  • TimerTask のコードは別のスレッドで実行されるため、呼び出しrunOnUiThreadてコードを実行する必要があります。

あなたはそれを正しくやっていますが、run メソッドで timertask を再作成するのはなぜですか? を使用することを検討してくださいscheduleAtFixedTime。100 は期間であり、遅延は 0 です。run メソッドは、実行するはずのタスクを実行します。

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //do whatever
        }
    });

scheduleAtFixedTime

*更新しました:

ビューの更新の場合は、 を使用することをお勧めします。こちらの例handler.postDelayedを参照してください。UI スレッドで遅延後に実行されます。

于 2013-06-13T11:23:58.257 に答える