2011-03-25 18 views
6

我對android文檔的閱讀發現了方法forceLayout()(它將在下一個佈局請求時產生布局顯示)和requestLayout()(它應該發佈即時佈局請求),但我不能讓他們像廣告一樣行事。特別是,如果我在Thread.Sleep之前和之後設置了一個文本,它會一次性設置兩個文本之前等待Sleep完成,不管我是否在兩者之間調用forceLayout()和requestLayout()。請不要回應很多關於我不應該在UI線程中調用Thread.Sleep的廢話。如果我將Thread.Sleep包裝在CountDownTimer中,它可以很好地工作(只要我的tick時間足夠短,不會影響睡眠時間,並且計時器的持續時間足夠長以允許睡眠完成。一個例子:forceLayout(),requestLayout()

int i=0; 
TextView tv2; 
TextView tv1; 
LinearLayout ll; 
Button bt; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ll=new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    tv1=new TextView(this); 
    tv2=new TextView(this); 
    bt=new Button(this); 
    bt.setText("Press to start"); 
    ll.addView(bt); 
    ll.addView(tv1); 
    ll.addView(tv2); 
    tv2.setText(""); 
    setContentView(ll); 
    bt.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      tv1.setText("starting sleep"); 
      new CountDownTimer(6000,50){ 
       public void onTick(long msuf) 
       {if(i==1) 
        { 
       try{ 
       Thread.sleep(4000); 
       tv2.setText("waking up"); 
       } 
      catch(InterruptedException e){}; 
      } 
       i++; 
       } 
       public void onFinish(){}}.start(); 
       }   
     }); 

     } 
+0

另請參閱http://stackoverflow.com/questions/13856180/usage-of-forcelayout-requestlayout-and-invalidate – Suragch 2017-02-24 04:22:31

回答

11

[很多的廢話約在UI線程中調用sleep()]如果我得到它的權利,你的意思是有這樣的:。

//...inside onTick() 
try { 
    tv2.setText("almost waking up"); // first setText() 
    Thread.sleep(4000); 
    tv2.setText("waking up"); // second seText() 
} 

如果你把你的主線程睡眠,它將停止處理任何事情:當前方法,線程循環和消息隊列,一旦再次喚醒,它將完成執行方法,w ith第二個setText()重寫第一個,然後讓線程循環繼續並執行UI刷新,只顯示第二個文本。

requestLayout()也不forceLayout()實際上可以使UI刷新立即,他們都將時間表的線環佈局的要求。我不知道,但我認爲它們之間的區別是,requestLayout()由已經改變其父它的大小/位置視圖調用,forceLayout()ViewGroup需要其子被重新叫 - 佈局。

因此[在UI線程中調用sleep()更無意義]。對於主線程處理程序調用postDelayed()的這種情況,可能是最好的解決方案,如果你不想搞亂多線程。

+0

你有什麼建議我可以強制我的佈局(一切)重繪?我有一個問題,我切換VideoView的可見性工作,但結果是不可見的(但可觸摸,所以我知道VideoView是否存在或...) – WarrenFaith 2011-03-25 10:00:55

+0

@WarrenFaith我想不出任何東西比打電話requestLayout()'或'invalidate()'在佈局的根部。不過,我認爲這是一個VideoView問題。你有沒有嘗試'GONE'和'INVISIBLE'? – bigstones 2011-03-25 10:17:42

+0

是的,沒有變化。如果我以可見的方式開始並嘗試使其消失,那麼只有當我彈出一個對話框時纔會消失。從不可見開始時也是如此 – WarrenFaith 2011-03-25 10:30:53

相關問題