0

ちょっと私は現在、いくつかのコードが200ミリ秒ごとに実行されるアプリを設計しています。これに使用するスレッドは次のようになります (簡略化):

final Handler handler = new Handler();
    Runnable runnable = new Runnable() 
    {   public void run() 
        {
              handler.postDelayed(this, 200);
            switch (status){
    case 1: check(1);p2.setBackgroundColor(0x00000000); p1.setBackgroundColor(0xDDCC0000);  status = 2; break;
    case 2: check(2);p1.setBackgroundColor(0x00000000); p2.setBackgroundColor(0xAAAA0000);  status = 1; break;
            }
        }
    }; runnable.run();

check() には、いくつかの非 UI コード行が含まれています。

問題は、キューが完全に実行されたときに postDelayed-200-ms が開始され、最初ではなく、常にシステムがコマンドスタックとスタックを常に実行する必要があるため、これらは実際には ~210-230ms ( CPU 負荷に応じて)

次に、スレッドの先頭でシステム日付を取得して 200 ミリ秒を追加しようとしましたが、これにより他の「より重い」エラーが発生します。

200 ミリ秒以上の遅延に問題はありません。安定して動作させたいだけです。

私の問題を理解していただき、アドバイスをいただければ幸いです。

EDIT:ハンドラーが許容範囲内で実行されることを知っています(200ミリ秒で4ミリ秒の遅延)。問題は、私が呼び出しているメソッドです。新しい質問を開きます

4

2 に答える 2

0

check() に非 UI コード行が含まれている場合は、それらを別のスレッドで実行する必要があります。

要するに、UI スレッドは *本当に忙しいので、200 ミリ秒ごとに何かを実行するように要求できますが、デバイスは他のあらゆる種類のことを行うために最善を尽くしているため、精度は保証されません。「より重い問題」と言うとき、正確には何を意味しますか?

スレッドを開始し、200 ミリ秒ごとにログを記録して、デバイスが希望する速度で何かを正確に実行できるかどうかを確認します。その場合は、UI スレッドにメッセージを送信して描画することができます。描画が遅れていることがわかった場合は、遅延を減らして UI スレッドに描画を完了する時間を与える必要がありますか? (明らかに、これも非常に不正確であり、デバイスによって大きく異なります)。

于 2013-07-26T10:46:35.193 に答える
0

Timersを使用して試しましたか?基本的な実装は次のようになります

new Timer().scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
    // TODO Auto-generated method stub

    }
}, 200, 200);

アラームサービスも試してみてください。正確な(または少なくとも一貫した)結果が得られるはずです。

于 2013-07-26T11:00:50.457 に答える