2013-02-18 44 views
2

我想在TextView上做setText(),並讓活動剛好在睡眠之後。睡覺前更新TextView

下面是代碼:

tv.setText("myText"); 
tv.invalidate(); // Doesn't work 
pause(1000); // French for sleep 

我的功能暫停:

public void pause(int seconds) 
{ 
    synchronized(this) 
    { 
     try { 
      this.wait(seconds); 
     } catch (InterruptedException ie) { 
      ie.printStackTrace(); 
     } 
    } 
} 

的問題是,TextView的不睡覺之前更新。我試圖在我的TextView上調用invalidate(),但它不起作用。

我有另一種可能的解決方案:創建一個新的線程休眠活動,如果我的TextView的值仍然是相同的,重新加載線程,否則調用我的功能pause()。但是有可能在View中獲得TextView的真實價值嗎?因爲我可以得到新的文本,當我做:

tv.setText("myText"); 
System.out.println(tv.getText()); 
pause(1000); // French for sleep 

儘管文本不會在視圖更新。

有什麼想法?

+0

在此添加完整代碼。 – Sajmon 2013-02-18 20:11:33

+0

你需要什麼睡眠/暫停功能?鎖定主線程永遠不是一個好主意,相反,如果你只是想在某段時間後運行某些東西,你應該使用'new Handler()。postDelayed(action)'。 – Jave 2013-02-18 20:12:06

+0

@Jave這是一個設置文本和睡眠線程的算法,使這個文本可讀。我沒有找到其他解決方案。線程恢復後,另一個文本正在顯示並睡眠線程等。 – 2013-02-18 20:20:12

回答

2

我建議Jave說什麼。

tv.setText("myText"); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //Do something 
      } 
     }, 3000); //3000 is time in ms. 
+0

我明白了。但問題是在3000ms後完成的操作並不總是相同的。我想我會用另一個功能,用步驟或類似的東西。 – 2013-02-18 20:31:44

0

如果使用UI線程並使其睡眠時間過長,將會得到應用程序無響應的對話框。當然,只有當函數結束時,你纔會看到新的值,所以這不是一個好的解決方案。如果您只想使用UI線程,則可以使用處理程序。

如果您使用不同的線程,您將需要使用UI線程以某種方式設置TextView的文本,因爲它是唯一允許這樣做的(使用處理程序)。

+0

好的謝謝,但我讓它睡了1秒。所以我會使用一個Handler – 2013-02-19 08:37:48