web-dev-qa-db-ja.com

Android sleep()UIをブロックしない

私の新しいAndroidアプリケーションの場合、アプリケーションが3秒間タイムアウトする関数が必要です。次のように関数 "sleep()"を試しました:

seekBar1.setProgress(50);                // Set something for my SeekBar

try{
   Thread.sleep(3000);                   // Wait for 3 Seconds
} catch (Exception e){
   System.out.println("Error: "+e);      // Catch the exception
}

button.setEnabled(true);                 // Enable my button

動作しているようですが、アプリケーションを実行している場合は、次のように動作します。3秒待って、進行状況を設定し、ボタンを有効にします。最初に進行状況を設定してから3秒待ってから、ボタンを有効にします。

"sleep()"は私の使用に適していますか、それともアプリケーションが正しい順序で実行できることを他に何ができますか?

19

次のようにpostDelayed()メソッドを使用できます。

handler=new Handler();
Runnable r=new Runnable() {
    public void run() {
        //what ever you do here will be done after 3 seconds delay.              
    }
};
handler.postDelayed(r, 3000);
31
Mohammad Arman

スリープ状態でUIスレッドをブロックしないでください。別のスレッドでスリープしても問題ありませんが、それでも回避する必要があります。これを行う正しい方法は、ハンドラにRunnableをポストすることです。次に、Runnableのrun()メソッドに遅延後に実行するコードを配置します。

2
Gabe Sechan

アクティビティでHandleを定義し、アクティビティのHandle.postDelayed()からonCreate()を使用して、3秒でそのハンドルに関するメッセージを受信できます。受信すると、ボタンを有効にできます。

AsyncTaskを使用しても同じことができます。doInBackground()では、3秒間スリープします。次に、onPostExecute()でボタンを有効にします。

Handlerクラスのオブジェクトを使用し、メソッドhandler.postDelayed(thread、time)を使用します。sleep()を使用しないでください。UIスレッドをブロックします。

1
Prinz Km