Java Android onCreate:Thread.sleep()导致以意外方式绘制内容

Java Android onCreate:Thread.sleep()导致以意外方式绘制内容,java,android,multithreading,concurrency,Java,Android,Multithreading,Concurrency,在正式介绍了并发性之后,我对并发性感到相当满意。由于我是Android新手,我开始编写一个简单的活动,它连续递归调用自己10次,并打印递归的深度 整个代码包含在onCreate方法中: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

在正式介绍了并发性之后,我对并发性感到相当满意。由于我是Android新手,我开始编写一个简单的活动,它连续递归调用自己10次,并打印递归的深度

整个代码包含在onCreate方法中:

    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Get recursion count
        Intent wasStartedWith = getIntent();
        final int cnt = wasStartedWith.getIntExtra("count", 0);

        // Update UI
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                TextView tv = findViewById(R.id.textView);
                tv.setText(cnt + "th recursive call");
            }
        });

        // Sleep 500ms before (possible) recursive call
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Check if non-basecase
        if (cnt != 10)
        {
            // Recursive call
            Intent recursiveIntent = new Intent(this, MainActivity.class);
            recursiveIntent.putExtra("count", cnt + 1);
            startActivity(recursiveIntent);
        }
}
考虑到该方法的顺序性,我希望执行顺序如下:

  • 从启动器调用的活动
  • 调用runOnUiThread时,runnable对象被传递给UI线程,该线程同时更新textView
  • 主线程(!=UI线程)休眠500毫秒
  • 主线程(假设它没有被中断)检查它是否是第10个递归调用。如果没有,它将创建一个新的意图,填充一个额外的意图并分派它
  • 转到2
  • 令人困惑的是,我在打开应用程序时出现了非常奇怪的行为:

  • 屏幕为空白,甚至标题栏也不显示
  • 几百毫秒后,屏幕会短暂闪烁几毫秒的预期内容
  • 转到1
  • 在这个执行过程中,在第2步(1、3、5、7、9、10)中,几乎每秒钟都会显示一次递归调用

    我的问题:

  • 假设UI线程同时运行(即不受主线程的thread.sleep()的影响),为什么在活动启动时屏幕没有画对
  • 我应该怎么做才能获得预期的行为

  • 你在一个错误的前提下工作。UI线程确实是应用程序的主线程。
    Thread.sleep()
    挂起了UI线程,这就是为什么没有立即绘制的原因。哦,哇,我只是假设runOnUiThread的命名将被视为“在专用UI线程上运行”。。。我想并不是一切都像看上去的那样。刚刚检查了文档(),我发现了一行:“如果当前线程是UI线程,那么立即执行操作。”根据这行,我仍然希望整个UI更新(和绘图)在线程之前进行。sleep()?UI事件和更新通过消息队列处理。您首先进行的那些UI修改(实际上,整个初始布局和绘图)基本上只是排队,当您在
    onCreate()
    中执行
    sleep()
    时,会挂起整个线程,包括消息队列的处理,因此UI布局和绘图,包括您的更新,直到
    sleep()才会发生
    已完成。跟着我?