2016-02-23 58 views
1
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(); 
} 

如果我是对的,这个Activity会从上到下执行代码(隐藏键盘,禁用按钮等)。后代码先在java/android中执行

然而,当我在我的手机上运行这个程序,它会等待1000毫秒,然后设置文本"Right!",改变背景等。

我觉得代码是从底部到顶部执行。我寻找答案,但没有出现。为什么会发生这种事情?

+1

您对执行顺序是正确的,但是您缺少一个关键元素 - 结果将在方法结束后显示(直到此时才显示任何内容)。但是,您的'Thread.sleep'是在UI线程上完成的,因此不会执行该方法并允许操作系统进行渲染。 –

回答

2

是的,它从上到下运行,但这里的问题是,当UI尝试刷新它并设置文本“正确!”时。到TextView,您要求UI线程睡眠1000毫秒。在此期间,您将看不到任何渲染。之后所有的渲染或用户界面更改都会发生。这不像你做tv.setText("Right!");safe.setBackgroundResource(R.drawable.safe_opened);,它会立即发生。这些东西迫使用户界面重新渲染自己,这需要一点时间(对人来说可以忽略不计)。在Framework可以刷新用户界面之前,您让它等待,这会导致延迟将这些更改应用于您要求的用户界面。

注意:强制UI线程睡觉从来都不是一个好主意。如果您需要等待某些操作,然后应用更改,则应根据需要使用ThreadHandler或可能为AsyncTask