11

プログラムを特定のミリ秒数だけ一時停止させたいのですが、どのようにすればよいでしょうか?

などのさまざまな方法を見つけましThread.sleep( time )たが、それが必要だとは思いません。コードを特定の行で x ミリ秒間一時停止させたいだけです。どんなアイデアでも大歓迎です。

これはCの元のコードです...

extern void delay(UInt32 wait){
    UInt32 ticks;
    UInt32  pause;

    ticks = TimGetTicks();
    //use = ticks + (wait/4);
    pause = ticks + (wait);
    while(ticks < pause)
        ticks = TimGetTicks();
}

待機はミリ秒単位です

4

8 に答える 8

18

このように UI スレッドをスリープ状態にしないでください。これを行うと、ActivityNotResponding 例外でアプリケーションが強制終了される可能性があります。

一部のコードの実行を一定時間遅らせたい場合は、次のように Runnable と Handler を使用します。

Runnable r = new Runnable() {
    @Override
    public void run(){
        doSomething(); //<-- put your code in here.
    }
};

Handler h = new Handler();
h.postDelayed(r, 1000); // <-- the "1000" is the delay time in miliseconds. 

この方法でもコードは遅延しますが、UI スレッドを「フリーズ」してパフォーマンスを低下させたり、最悪の場合 ANR を強制終了させたりすることはありません。

于 2012-07-18T19:48:41.833 に答える
9

OK、まず第一に、あなたがやっているようにビジーループで遅延を実装しないでください. 私はそれがどこから来たのかを見ることができます - Palm Pilot は組み込みの sleep() 関数を持たない単一プロセスのデバイスだったと推測していますが、マルチプロセス デバイスでは、そのようなビジー ループは単に全体をもたらします。プロセッサーをひざまずかせます。バッテリーが消耗し、通常のシステム タスクが正常に実行されなくなり、他のプログラムの速度が低下したり、完全に停止したり、デバイスが応答しなくなったり、手が熱くなったりすることさえあります。

探している呼び出しは Thread.sleep() です。スリープ中に発生する割り込み例外をキャッチするように設定する必要があります。

第 2 に、Android (またはほとんどすべての最新の GUI システム) などのイベントベースのユーザー インターフェイスでは、UI スレッドでスリープ状態になりたくありません。また、他の投稿者が言及しているように、デバイス全体がフリーズし、ANR (Activity Not Responding) クラッシュが発生します。最も重要なことは、これらの小さなフリーズがユーザー エクスペリエンスを完全に台無しにすることです。

(例外: ユーザーがおそらく気付かないほど短い間隔でスリープしている場合は、それを回避できます。1/4 秒はおそらく問題ありませんが、状況によってはアプリケーションが不安定になる可能性があります。)

残念ながら、ループ ベースのアプリケーションをイベント ベースのシステムに移植する場合、目的を達成するためのクリーンで洗練された方法はありません。

つまり、適切な手順は、UI スレッドでハンドラーを作成し、それに遅延メッセージを送信することです。遅延メッセージはアプリケーションを「起動」し、遅延後に実行しようとしていたことを実行するようにトリガーします。

このようなもの:

View gameBoard;     // the view containing the main part of the game
int gameState = 0;  // starting
Handler myHandler;

public void onCreate(Bundle oldState) {
  super.onCreate(oldState);
  ...
  gameBoard = findViewById(R.layout.gameboard);
  myHandler = new Handler();
  ...
}

public void onResume() {
  super.onResume();
  displayStartingScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState1(); 
  }, 250);
}

private void gotoState1() {
  // It's now 1/4 second since onResume() was called
  displayNextScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState2();
  }, 250);
}
...
于 2012-07-18T23:18:22.803 に答える
3

次のようなことをしてください。ここに参照へのリンクがあります。これは役立つかもしれません。

final MyActivity myActivity = this;   

    thread=  new Thread(){
        @Override
        public void run(){
            try {
                synchronized(this){
                    wait(3000);
                }
            }
            catch(InterruptedException ex){                    
            }

            // TODO              
        }
    };

    thread.start();   
于 2012-07-18T19:30:32.160 に答える
1

プログラムを一時停止する理由がわかりません。バックグラウンドで何らかのタスクを実行して結果を使用したい場合は、AsyncTaskを見てください。少し前に同様の質問がありました。

于 2012-07-18T19:35:45.153 に答える
0

Thread.sleep(....)はおそらくあなたが望むものだと思いますが、正しく実行していない可能性があります。正確に何を一時停止しようとしていますか? うまくいけば、UI スレッドではないでしょうか? ある種の間隔でいくつかのタスクを実行するバックグラウンド スレッドがあると思いますか? その場合、 Thread.sleep はその特定のスレッドを一定時間スリープさせますが、すべてのスレッドを一時停止するわけではありません。

于 2012-07-18T19:29:57.537 に答える