2016-02-23 98 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