java – 在Thread.sleep()阻塞之前调用并返回Android TextView.setText(),直到sleep()返回.为什么?

在Android框架中,如果调用了TextViewsetText()方法,并且在调用Thead.sleep()之后调用了该方法,那么在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()时传递的文本不会出现在屏幕上,直到线程睡眠五秒钟,即使日志条目出现在在这五秒钟开始之前记录.

为什么会发生这种情况,我应该怎样做才能使第一次调用setText()时传递的文本在线程开始进入睡眠状态之前出现在屏幕上?

1)永远不要在UI线程上睡多久.事实上,永远不要睡觉.这导致它阻止并使手机无响应

2)setText调用视图无效.这将导致框架一旦它能够再次绘制视图 – 但这意味着需要完成它所做的当前事情并返回到主Looper(基本上,它需要从它首先调用的代码中的任何方法返回).在此之前,更改将不会在屏幕上显示.

编辑:换句话说,在我们拥有的框架内

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

在完成当前消息之前,它无法访问绘制消息.它的单线程.

https://stackoverflow.com/questions/16595467/android-textview-settext-invoked-returned-before-thread-sleep-blocks-until

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 在Thread.sleep()阻塞之前调用并返回Android TextView.setText(),直到sleep()返回.为什么?