后一种代码首先在java/android中执行

后一种代码首先在java/android中执行,java,android,Java,Android,如果我是对的,这个活动将从上到下执行代码(隐藏键盘、禁用按钮等) 但是,当我在手机上运行此应用程序时,它会等待1000毫秒,然后将文本设置为“Right!”,更改背景等 我认为代码是自下而上执行的。我寻找答案,但什么也没找到。为什么会发生这种情况?是的,它确实从上到下运行,但这里的问题是,当UI尝试刷新它并将文本“Right!”设置为TextView时,您要求UI线程睡眠1000毫秒。在此期间,您将看不到任何渲染。所有呈现或UI更改都发生在这之后。它不像你做的那样tv.setText(“对!”)

如果我是对的,这个
活动将从上到下执行代码(隐藏键盘、禁用按钮等)

但是,当我在手机上运行此应用程序时,它会等待1000毫秒,然后将文本设置为
“Right!”
,更改背景等


我认为代码是自下而上执行的。我寻找答案,但什么也没找到。为什么会发生这种情况?

是的,它确实从上到下运行,但这里的问题是,当UI尝试刷新它并将文本“Right!”设置为
TextView
时,您要求UI线程睡眠1000毫秒。在此期间,您将看不到任何渲染。所有呈现或UI更改都发生在这之后。它不像你做的那样
tv.setText(“对!”)或<代码>安全设置背景资源(R.drawable.safe\u打开)并且它将立即发生。这些事情迫使UI重新呈现它自己,这需要一点时间(对人类来说可以忽略不计)。在框架刷新UI之前,您要求它等待,这导致延迟将这些更改应用到您要求的UI


注意:强制UI线程睡眠从来都不是一个好主意。如果您需要等待某些操作,然后应用更改,则应使用
线程
处理程序
,或者可以根据需要使用
异步任务

关于执行顺序,您是对的,但此处缺少一个关键元素-结果将在方法完成后显示但是,您的
Thread.sleep
是在UI线程上完成的,因此阻止方法执行并允许操作系统渲染。
if(b){ 
    mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    tv.setText("Right!");
    check.setClickable(false);
    check.setVisibility(View.INVISIBLE);
    safe.setBackgroundResource(R.drawable.safe_opened);

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finish();
}