2010-12-13 54 views
7

我有這樣的:如何在Android中循環時刷新TextView?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    TextView debugView = (TextView)findViewById(R.id.debugView); 

    for(int i=0;i<100;i++) { 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     debugView.setText(Integer.toString(i)); 
    } 

} 

我希望它更新文本通過循環每次查看,所以我會得到: 1,2,3,... 99

取代App什麼也沒做10秒,然後輸出:99

我猜我需要在循環期間刷新TextView。我是Android開發新手。有人可以告訴我,如果這是完成這個最好的方法嗎?

我最終的目標是能夠處理音頻樣本以構建吉他調音器。我試圖直觀地驗證應用程序是否響應外部音頻,我想更新TextView來證明這一點。請告知是否有更好的方法來做到這一點。

+2

沒有被顯示,直到的onCreate回報。 – Falmarri 2010-12-13 03:58:19

回答

6

你的問題是你在onCreate()中運行你的循環。在您的Activity顯示之前,這發生在UI線程上。

查看Android中的Activity lifecycle。它顯示onCreate只是活動創建中的一個階段。你需要做的是在後臺線程上運行循環,並通知使用runOnUiThread將TextView更新到UI線程中。 Christian的答案顯示瞭如何做到這一點。

但是,看到你的最終目標是基於某些用戶輸入(在你的案例中的音頻)更新TextView,你將不必跳過所有這些循環來使它工作。唯一重要的是你發佈你的調用來更新UI線程上的UI,否則你會得到異常。

+0

出於同樣的問題。 – 2014-09-17 22:21:56

8

你最好使用定時器:

new Timer().schedule(new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        debugView.setText("something"); 
       } 
      }); 
     } 
    }, 0, 100); 

請注意,我用runOnUiThread,因爲你不能修改從另一個線程不是主要的一個觀點。

+0

對於我的實際使用情況,我需要進入循環內,因爲我正在拉取音頻樣本。我已經可以使用Log.i()顯示輸出了。我只是在尋找一種簡單的方式將這些信息顯示給Android設備。我不在乎什麼類型的接口是必要的,或者即使我必須使用其中一個圖形用戶界面(如果它比在TextView上渲染更快)繪製某些東西。如果您有任何建議,在循環時如何做到這一點,我將不勝感激。謝謝。 – chaimp 2010-12-13 04:05:02

+0

只是說明一下,Thread.sleep(100)僅用於測試這個目的,所以它不會太快以至於我錯過它。儘管如此,我實際上並不希望有一個100毫秒的間隔。理想情況下,它應該儘可能快。 – chaimp 2010-12-13 04:06:02

+1

在這種情況下,使用AsyncTask。在這裏有很多例子在stackoverflow或谷歌。 – Cristian 2010-12-13 04:12:37

22

我有同樣的問題,我有一個處理程序解決它:

public class myClass extends Activity{ 

private Handler mHandler; 
private TextView text; 
private int i; 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      text = (TextView) findViewById(R.id.textView01); 
      i = 0; 
      mHandler = new Handler(); 
      mHandler.post(mUpdate); 

     } 

private Runnable mUpdate = new Runnable() { 
    public void run() { 

     text.setText("My number: " + i); 
     i++; 
     mHandler.postDelayed(this, 1000); 

    } 
};} 

隨着mHandler.post(mUpdate)你打電話mUpdate那就是在不同的線程可以更新用戶界面運行一個Runnable。在方法run()中,不是創建for循環,而是使用與您的問題相同的問題,您可以使用輔助變量設置所需的文本,將其增加並調用mHandler.postDelayed(this,updateTime)。在這一刻,視圖更新,並且在屏幕上顯示了文本,在指定的時間之後(以毫秒爲單位),Runnable mUpdate將再次被調用,並將文本設置爲下一個數字,所以上。

我希望它有幫助。

1

而不是使用處理器有可能直接傳遞Runnable接口來查看與postDelayed的:

public class myClass extends Activity { 

    private TextView text; 
    private int i; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     text = (TextView) findViewById(R.id.textView01); 
     text.postDelayed(mUpdate, 0); 

    } 

    private Runnable mUpdate = new Runnable() { 
     public void run() { 

      text.setText("My number: " + i); 
      i++; 
      text.postDelayed(this, 1000); 

     } 
    }; 
}