2012-03-22 43 views
1

我有點困惑,不知道在哪裏尋找。我想要的是每5秒鐘刷新一次屏幕文本cn & sn。我怎樣才能使用這個線程來處理它?它是我更新文本框的唯一玩法。我使用線程消息/處理程序管理它,但時間太長。那麼有沒有更簡單的方法?從線程錯誤更新視圖

Thread t = new Thread(){ 
public void run() { 
while(true) { 
    cn.setText(getClName()); //mutated text 
    sn.setText(getSN());  //mutated text 
    Thread.sleep(5 * 1000); 
    } 
} 
}; 
t.start(); 

我得到這樣的錯誤:

03-22 09:04:22.669: E/AndroidRuntime(7877): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
03-22 09:04:22.669: E/AndroidRuntime(7877): at android.view.ViewRoot.checkThread(ViewRoot.java:3020) 
03-22 09:04:22.669: E/AndroidRuntime(7877): at android.view.ViewRoot.requestLayout(ViewRoot.java:634) 
03-22 09:04:22.669: E/AndroidRuntime(7877): at android.view.View.requestLayout(View.java:8267) 
03-22 09:04:22.669: E/AndroidRuntime(7877): at android.view.View.requestLayout(View.java:8267) 
03-22 09:04:22.669: E/AndroidRuntime(7877): at android.view.View.requestLayout(View.java:8267) 
03-22 09:04:22.669: E/AndroidRuntime(7877): at android.view.View.requestLayout(View.java:8267) 
03-22 09:04:22.669: E/AndroidRuntime(7877): at 


03-22 09:04:28.849: E/global(7877): Deprecated Thread methods are not supported. 
03-22 09:04:28.849: E/global(7877): java.lang.UnsupportedOperationException 
03-22 09:04:28.849: E/global(7877): at java.lang.VMThread.stop(VMThread.java:85) 
03-22 09:04:28.849: E/global(7877): at java.lang.Thread.stop(Thread.java:1280) 
03-22 09:04:28.849: E/global(7877): at java.lang.Thread.stop(Thread.java:1247) 
03-22 09:04:28.849: E/global(7877): at android.kvisio.Main.onDestroy(Main.java:298) 
+0

Android UI不是線程安全的,所以只有UI Therad可以更新UI。 。 。 。 – aProgrammer 2012-03-22 08:38:58

+0

您無法從Java線程進行UI更改。您可以檢查[點擊這裏] [1] [1]:http://stackoverflow.com/questions/9578548/to-invoke-a-method-of-the-main-thead-from-child -thread/9578652#9578652 – MobiDev 2012-03-22 08:45:08

回答

2

按照目前的Android文檔只有UI線程可以更新UI,但是讓你的系統工作,你可以使用處理器和發送信息更新UI ......看到這question

你可以還可以使用的AsyncTask,讀一篇好的博客here ..

0
cn.setText(getClName()); //mutated text 
sn.setText(getSN());  

這裏的問題。解決你必須修改視圖到UI線程。要做到這一點,你可以使用handler,或者如果你是一個活動中您可以使用runOnUiThread(Runnable)

3

聲明類型處理器的類成員

private Handler uiCallback; 

然後,在你的代碼:

uiCallback = new Handler() { 
    public void handleMessage (Message msg) { 
     cn.setText(getClName()); //mutated text 
     sn.setText(getSN());  //mutated text 
    } 
}; 

Thread t = new Thread(){ 
public void run() { 
while(true) { 
    uiCallback.sendEmptyMessage(0); 
    Thread.sleep(5 * 1000); 
    } 
} 
}; 
t.start(); 

This article解釋您的問題。

+0

謝謝!這非常有幫助! – Hia 2012-03-22 09:53:58

4

做到這一點,

Thread t = new Thread(){ 
public void run() { 
while(true) { 

    YouActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      cn.setText(getClName()); //mutated text 
      sn.setText(getSN());  //mutated text 
     } 
    }); 
    Thread.sleep(5 * 1000); 
    } 
} 
}; 
t.start(); 

您必須始終從UI線程中運行你的UI活動。 ANdroid試圖通過提供AsyncTask來幫助開發人員做到這一點。儘可能嘗試並使用它。如果您不能滿足要求,請使用runOnUiThread()功能。

+0

**此代碼根據您的要求是正確的。這裏一個線程開始了無限的時間。所以當你的活動暫停時,不要忘記停止線程,並在你的活動恢復時重新開始。** – Anil 2012-03-22 08:53:58