3

Android フレームワークでは、TextViewsetText()メソッドが呼び出され、それが返された後にThead.sleep()が呼び出された場合、デバイスの画面は after が返されるまで、指定されたテキストを表示しませんsleep()。なんで?

public class SleeperActivity extends Activity {
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.main);
    }

    public void doDelay(View view) {
        try {
            TextView textView = (TextView) view;
            textView.setText("Sleeping");
            Log.d("Sleeper", "This log entry is invoked before sleeping");
            Thread.sleep(5000L);
            textView.setText("Ready");
        } catch (InterruptedException e) { finish(); }
    }
}

onClick表示されていないレイアウトには、属性が に設定されたボタンがありますdoDelay()

上記のコードをコンパイルして実行し、ボタンをクリックすると、最初の呼び出しで渡されたテキストはsetText()、スレッドが 5 秒間スリープするまで画面に表示されません。 5 秒が経過し始めます。

スレッドがスリープ状態になる前に、最初の呼び出しで渡されたテキストがsetText()画面に表示されるようにするには、どうすればよいでしょうか?

4

2 に答える 2

3

1) UI スレッドで長時間スリープしないようにします。実際、絶対に寝ないでください。それによりブロックされ、電話が応答しなくなります

2) setText 呼び出しはビューで無効になります。これにより、フレームワークは可能な限りすぐにビューを再度描画しますが、それは現在行っていることを終了し、メインのルーパーに戻る必要があることを意味します (基本的に、最初に呼び出したコード内のメソッドから戻る必要があります) )。それまでは、変更は画面に表示されません。

編集:別の言い方をすれば、私たちが持っているフレームワークの中で

do{
    Message msg = nextMessage();
    if(msg.what == ON_CREATE){
       currentActivity.onCreate();
    }
    else if(msg.what == DRAW){
        rootView.onDraw();
        //draw entire screen
    }
    else 
      ...  //Thousands of more events like touches, handlers, etc

現在のメッセージが完了するまで、描画メッセージに到達できません。シングルスレッドです。

于 2013-05-16T19:11:03.217 に答える